C'è un modo per dire che cosa script è in esecuzione quando si è iniziato con -filename start-lavoro?

StackOverflow https://stackoverflow.com/questions/4227364

  •  26-09-2019
  •  | 
  •  

Domanda

Sto iniziando un lavoro di PowerShell con qualcosa come il seguente comando:

start-job -filename my_script.ps1 -argumentlist ($v1, $v2, $v3)

Questo script, però ha bisogno di sapere dove si trova, perché si corre altri comandi in base alla loro posizione relativa ad esso. Quando viene eseguito direttamente dal prompt, costruisce come questi lavori:

join-path (split-path (& { $myinvocation.scriptname })) "relative path\filename"
join-path (split-path $myinvocation.mycommand.definition) "relative path\filename"

Questo non funziona affatto quando è iniziato come un lavoro come nel primo esempio, però. Come è possibile determinare dove sto correndo da quando sto iniziato come un lavoro?

È stato utile?

Soluzione

Sembra di essere come il caso della configurazione remota in cui il file viene passato il lavoro come un blocco di script in modo che il concetto di quale file script è venuto da si perde. Si potrebbe passare nel percorso così (anche se questo sembra meno che ideale):

PS> gc .\job.ps1
param($scriptPath)
"Running script $scriptPath"
PS> $job = Start-Job -FilePath .\job.ps1 -ArgumentList $pwd\job.ps1
PS> Wait-Job $job

Id  Name            State      HasMoreData     Location  Command
--  ----            -----      -----------     --------  -------
13  Job13           Completed  True            localhost param($scriptPath)...


PS> Receive-Job $job.id
Running script C:\Users\hillr\job.ps1

Altri suggerimenti

AGGIORNAMENTO:

mi sono imbattuto in questo esempio di codice:

http://blog.brianhartsock.com / 2010/05/22 / un-better-start-job-cmdlet /

Invece di uno ScriptBlock, per utilizzare il parametro FilePath, ho modificato come tale:

param([string]$file)

$filePath = split-path $file -parent
Start-Job -Init ([ScriptBlock]::Create("Set-Location $filePath")) -FilePath $file -ArgumentList $args

Questo sarebbe chiamato come:

Start-JobAt c:\full_path\to\file\my_script.ps1 ($v1, $v2, $v3)

Utilizzando -init (-InitializationScript) e sparando fuori il Set-Location sposta il processo corrente alla directory dello script, quindi, da lì si può determinare la posizione relativa.

Mentre il post sul blog cita, si potrebbe avere questo come uno script esterno (ho provato il mio come start-JobAt.ps1) oppure renderlo parte del profilo della tua / di account di servizio dell'utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top