about_Jobs
Aggiornamento: maggio 2014
Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
ARGOMENTO
about_Jobs
DESCRIZIONE BREVE
Fornisce informazioni su come i processi in background di Windows PowerShell eseguono un comando o un'espressione in background senza interazioni con la sessione corrente.
DESCRIZIONE LUNGA
In questo argomento viene descritto come eseguire i processi in background in Windows PowerShell in un computer locale. Per informazioni sull'esecuzione di processi in background nei computer remoti, vedere about_Remote_Jobs.
Quando si avvia un processo in background, viene immediatamente restituito il prompt dei comandi, persino se il completamento del processo richiede molto tempo. È possibile continuare a lavorare nella sessione senza interruzioni durante l'esecuzione del processo.
CMDLET JOB
Start-Job
Avvia un processo in background in un computer locale.
Get-Job
Ottiene i processi in background avviati nella sessione corrente.
Receive-Job
Ottiene i risultati dei processi in background.
Stop-Job
Arresta un processo in background.
Wait-Job
Elimina il prompt dei comandi fino al completamento di uno o tutti i processi.
Remove-Job
Elimina un processo in background.
Invoke-Command
Il parametro AsJob esegue qualsiasi comando come processo in background in un computer remoto. È inoltre possibile usare Invoke-Command per eseguire qualsiasi comando del processo in remoto, incluso un comando Start-Job.
COME AVVIARE UN PROCESSO NEL COMPUTER LOCALE
Per avviare un processo in background nel computer locale, usare il cmdlet Start-Job.
Per scrivere un comando Start-Job, racchiudere il comando che viene eseguito dal processo tra parentesi graffe ( { } ). Usare il parametro ScriptBlock per specificare il comando.
Il comando seguente avvia un processo in background che esegue un comando Get-Process nel computer locale.
Start-Job -ScriptBlock {Get-Process}
Il comando Start-job restituisce un oggetto che rappresenta il processo. L'oggetto processo contiene informazioni utili sul processo, ma non contiene i risultati del processo.
Salvare l'oggetto processo in una variabile e quindi usarlo con altri cmdlet Job per gestire il processo in background. Il comando seguente avvia un oggetto processo e salva l'oggetto processo risultante nella variabile $job.
$job = Start-Job -ScriptBlock {Get-Process}
È inoltre possibile usare il cmdlet Get-Job per ottenere gli oggetti che rappresentano i processi avviati nella sessione corrente. Get-Job restituisce lo stesso oggetto processo restituito da Start-Job.
VISUALIZZAZIONE DEGLI OGGETTI PROCESSO
Per visualizzare gli oggetti che rappresentano i processi in background avviati nella sessione corrente, usare il cmdlet Get-Job. Senza parametri, Get-Job restituisce tutti i processi avviati nella sessione corrente.
Ad esempio, il comando seguente ottiene i processi nella sessione corrente.
PS C:\>Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
È inoltre possibile salvare l'oggetto processo in una variabile e usarlo per rappresentare il processo in un comando successivo. Il comando seguente ottiene il processo con ID 1 e lo salva nella variabile $job.
$job = Get-Job -Id 1
L'oggetto processo contiene lo stato del processo, che indica se il processo è terminato. Un processo terminato presenta lo stato "Complete" o "Failed". Un processo può anche essere bloccato o in esecuzione.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
VISUALIZZAZIONE DEI RISULTATI DI UN PROCESSO
Quando si esegue un processo in background, i risultati non vengono visualizzati immediatamente. Al contrario, il cmdlet Start-Job restituisce un oggetto processo che rappresenta il processo, ma non contiene i risultati. Per ottenere i risultati di un processo in background, usare il cmdlet Receive-Job.
Il comando seguente usa il cmdlet Receive-Job per ottenere i risultati del processo. Il comando usa un oggetto processo salvato nella variabile $job per identificare il processo.
Receive-Job -Job $job
Il cmdlet Receive-Job restituisce i risultati del processo.
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
...
È inoltre possibile salvare i risultati di un processo in una variabile. Il comando seguente salva nella variabile $results i risultati del processo nella variabile $job.
$results = Receive-Job -Job $job
Inoltre, è possibile salvare i risultati del processo in un file mediante l'operatore di reindirizzamento (>) o il cmdlet Out-File. Il comando seguente usa l'operatore di reindirizzamento per salvare i risultati del processo nella variabile $job nel file Results.txt.
Receive-Job -Job $job > results.txt
VISUALIZZAZIONE E MANTENIMENTO DEI RISULTATI PARZIALI DI UN PROCESSO
Il cmdlet Receive-Job ottiene i risultati di un processo in background. Se il processo è stato completato, Receive-Job ottiene tutti i risultati del processo. Se il processo è ancora in esecuzione, Receive-Job ottiene i risultati generati finora. È possibile eseguire nuovamente i comandi Receive-Job per ottenere i risultati rimanenti.
Per impostazione predefinita, quando Receive-Job restituisce risultati, elimina quelli provenienti dalla cache in cui sono archiviati i risultati del processo. Se si esegue un altro comando Receive-Job, si ottengono solo i risultati che non sono stati ancora ricevuti.
I comandi seguenti mostrano i risultati dei comandi Receive-Job eseguiti prima del completamento del processo.
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Per impedire che Receive-Job elimini i risultati del processo restituiti, usare il parametro Keep. Di conseguenza, Receive-Job restituisce tutti i risultati generati fino a quel momento.
I comandi seguenti mostrano l'effetto dell'utilizzo del parametro Keep in un processo non ancora completato.
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
ATTESA DEI RISULTATI
Se si esegue un comando il cui completamento richiede molto tempo, è possibile usare le proprietà dell'oggetto processo per determinare quando il processo è completo. Il comando seguente usa l'oggetto Get-Job per ottenere tutti i processi in background nella sessione corrente.
Get-Job
I risultati vengono visualizzati in una tabella. Lo stato del processo viene visualizzato nella colonna State.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log Syst...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Recurse
In questo caso, la proprietà State indica che Job 2 è ancora in esecuzione. In caso di utilizzo del cmdlet Receive-Job per ottenere i risultati del processo in questo momento, i risultati sarebbero incompleti. È possibile usare il cmdlet Receive-Job ripetutamente per ottenere tutti i risultati. Per impostazione predefinita, ogni volta che viene usato, si ottengono solo i risultati che non sono stati già ricevuti, ma è possibile utilizzare il parametro Keep del cmdlet Receive-Job per mantenere i risultati, anche se sono stati ricevuti in precedenza.
È possibile scrivere i risultati parziali in un file e quindi aggiungere quelli più recenti nel momento in cui vengono ricevuti oppure attendere e controllare lo stato del processo in un secondo momento.
È possibile usare il parametro Wait del cmdlet Receive-Job, che non restituisce il prompt dei comandi finché il processo è completo e tutti i risultati sono disponibili.
È inoltre possibile usare il cmdlet Wait-Job per attendere i risultati del processo. Wait-Job consente di attendere il completamento di un determinato processo, di tutti i processi o di una parte di essi.
Il comando seguente usa il cmdlet Wait-Job per attendere un processo con ID 10.
Wait-Job -ID 10
Di conseguenza, il prompt di Windows PowerShell viene eliminato fino al completamento del processo.
È inoltre possibile attendere un periodo di tempo predeterminato. Questo comando usa il parametro Timeout per limitare l'attesa a 120 secondi. Allo scadere del tempo si ritorna al prompt dei comandi, ma il processo continua a essere eseguito in background.
Wait-Job -ID 10 -Timeout 120
ARRESTO DI UN PROCESSO
Per arrestare un processo in background, usare il cmdlet Stop-Job. Il comando seguente avvia un processo per ottenere tutte le voci nel registro eventi di sistema. Salva l'oggetto processo nella variabile $job.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Il comando seguente arresta il processo. Usa un operatore pipeline (|) per inviare il processo nella variabile $job a Stop-Job.
$job | Stop-Job
ELIMINAZIONE DI UN PROCESSO
Per eliminare un processo in background, usare il cmdlet Remove-Job. Il comando seguente elimina il processo nella variabile $job.
Remove-Job -Job $job
ANALISI DI UN PROCESSO NON RIUSCITO
Per scoprire la causa della mancata riuscita di un processo, usare la sottoproprietà Reason dell'oggetto processo.
Il comando seguente avvia un processo senza le credenziali necessarie. Salva l'oggetto processo nella variabile $job.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:\S...
Il comando seguente usa la proprietà Reason per individuare l'errore che ha causato l'esito negativo del processo.
$job.ChildJobs[0].JobStateInfo.Reason
In questo caso, il processo non è riuscito perché il computer remoto ha richiesto credenziali esplicite per eseguire il comando. Il valore della proprietà Reason è:
Connecting to remote server failed with the following error
message : Access is denied.
VEDERE ANCHE
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command