2009-11-12 5 views
5

Sto cercando di eseguire processi in background in PowerShell 2.0 e vedo cose diverse con start-job e invoke-command -asjob.Start-job vs. Invoke-command -asjob

Se faccio questo:

start-job -scriptblock {get-process}

ho ottenere un oggetto di lavoro, ma il lavoro infantile (che viene creato automaticamente dal Start-Job) ha sempre un JobStateInfo di "NotStarted".

questo, tuttavia, funziona come previsto:

invoke-command -scriptblock {get-process} -computer localhost -asjob

Ho eseguito l'enable-psremoting .... qualsiasi altra cosa ho bisogno di fare per ottenere i processi in background di lavoro?

risposta

4

Il primo esempio che utilizza start-job non utilizza HTTP per la chiamata e utilizza invece un canale IPC con WinRM per l'esecuzione; non richiede i privilegi amministrativi in ​​questo modo. Il secondo esempio con invoke-command richiede diritti di amministratore (per impostazione predefinita) e si connetterà tramite HTTP e WinRM.

Per essere onesti, mi sarei aspettato che il secondo fallisse per la maggior parte delle persone. Se si esegue: Receive-Job rispetto all'ID del richiamo del job di avvio, viene visualizzato un messaggio di errore?

-Oisin

+0

No, non restituisce nulla (cosa che mi aspetto dato che il lavoro figlio è ancora NotStarted). –

+0

BTW ... è bello sapere che lavorano in modo diverso internamente. Ancora non spiega perché lo start-job non funziona, ma almeno non sono pazzo. –

0

Per ricevere una JobStateInfo aggiornato è necessario utilizzare Get-Job e il lavoro creato da Start-Job. Tuttavia, se si stanno utilizzando queste informazioni per vedere quando termina il lavoro, Wait-Job o Receive-Job -wait potrebbe essere più adatto alle proprie esigenze.

Wait-Job attende semplicemente fino a quando il lavoro o l'elenco dei lavori, indicati, sono terminati prima di proseguire. Receive-Job -wait fa la stessa cosa, ma raccoglie anche i risultati/l'output del lavoro.