Informazioni sui processi
DESCRIZIONE BREVE
Fornisce informazioni sul modo in cui i processi in background di PowerShell eseguono un comando o un'espressione in background senza interagire con la sessione corrente.
DESCRIZIONE LUNGA
In questo argomento viene illustrato come eseguire processi in background in PowerShell in un computer locale. Per informazioni sull'esecuzione di processi in background in computer remoti, vedere about_Remote_Jobs.
Quando si avvia un processo in background, il prompt dei comandi viene restituito immediatamente, anche se il completamento del processo richiede un tempo prolungato. È possibile continuare a lavorare nella sessione senza interruzioni durante l'esecuzione del processo.
CMDLET JOB
Cmdlet | Descrizione |
---|---|
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 |
Disattiva il prompt dei comandi fino a quando uno o tutti i processi sono |
completare. | |
Remove-Job |
Elimina un processo in background. |
Invoke-Command |
Il parametro AsJob esegue qualsiasi comando come sfondo |
processo in un computer remoto. Il cmdlet | |
Invoke-Command per eseguire qualsiasi comando del processo in modalità remota, |
|
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 il processo viene eseguito tra parentesi graffe ({}). Usare il parametro ScriptBlock per specificare il comando.
Il comando seguente avvia un processo in background che esegue un Get-Process
comando nel computer locale.
Start-Job -ScriptBlock {Get-Process}
Il Start-Job
comando 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 gli 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}
È anche possibile usare il Get-Job
cmdlet per ottenere gli oggetti che rappresentano i processi avviati nella sessione corrente. Get-Job
Restituisce lo stesso oggetto processo restituito da Start-Job.
RECUPERO DI OGGETTI PROCESSO
Per ottenere un oggetto che rappresenta i processi in background avviati nella sessione corrente, utilizzare il Get-Job
cmdlet. 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
È anche 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 completato ha uno stato "completo" o "non riuscito". Un processo potrebbe essere anche bloccato o in esecuzione.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
OTTENERE I 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 Receive-Job
cmdlet.
Il comando seguente usa il Receive-Job
cmdlet per ottenere i risultati del processo. 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
# ...
È anche possibile salvare i risultati di un processo in una variabile. Il comando seguente salva i risultati del processo nella $ variabile job nella $ variabile results.
$results = Receive-Job -Job $job
È possibile salvare i risultati del processo in un file usando 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 del processo nel file di Results.txt.
Receive-Job -Job $job > results.txt
RECUPERO E MANTENIMENTO DEI RISULTATI PARZIALI DEL PROCESSO
Il cmdlet Receive-Job ottiene i risultati di un processo in background. Se il processo è completo, Receive-Job
ottiene tutti i risultati del processo. Se il processo è ancora in esecuzione, Receive-Job ottiene i risultati generati fino a questo punto.
È possibile eseguire Receive-Job
di nuovo i comandi per ottenere i risultati rimanenti.
Quando Receive-Job
restituisce i risultati, per impostazione predefinita i risultati vengono eliminati dalla cache in cui vengono archiviati i risultati del processo. Se si esegue un altro Receive-Job
comando, si ottengono solo i risultati non ancora ricevuti.
I comandi seguenti mostrano i risultati dei Receive-Job
comandi 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 evitare di Receive-Job
eliminare i risultati del processo restituiti, usare il parametro Keep . Di conseguenza, Receive-Job
restituisce tutti i risultati generati fino a quel momento.
Nei comandi seguenti viene illustrato 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
IN ATTESA DEI RISULTATI
Se si esegue un comando che richiede molto tempo per il completamento, è possibile usare le proprietà dell'oggetto processo per determinare quando il processo è completo. Il comando seguente usa l' Get-Job
oggetto 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 stato.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
In questo caso, la proprietà state rivela che il processo 2 è ancora in esecuzione. Se si utilizza il Receive-Job
cmdlet per ottenere i risultati del processo adesso, i risultati saranno incompleti. È possibile utilizzare Receive-Job
ripetutamente il cmdlet per ottenere tutti i risultati. Per impostazione predefinita, ogni volta che si usa, si ottengono solo i risultati non ancora ricevuti, ma è possibile usare il parametro Keep del cmdlet Receive-Job per conservare i risultati, anche se sono già stati ricevuti.
È possibile scrivere i risultati parziali in un file e quindi accodare i risultati più recenti Man mano che arrivano oppure attendere e controllare lo stato del processo in un secondo momento.
È possibile usare il parametro Wait del Receive-Job
cmdlet, che non restituisce il prompt dei comandi finché il processo non viene completato e tutti i risultati sono disponibili.
È inoltre possibile utilizzare il Wait-Job
cmdlet per attendere uno o tutti i risultati del processo. Wait-Job
consente di attendere un determinato processo, per tutti i processi o per tutti i processi da completare.
Il comando seguente usa il cmdlet Wait-Job per attendere un processo con ID 10.
Wait-Job -ID 10
Di conseguenza, il prompt di PowerShell viene eliminato fino al completamento del processo.
È anche possibile attendere un periodo di tempo predeterminato. Questo comando usa il parametro timeout per limitare l'attesa a 120 secondi. Al termine dell'intervallo di tempo, il prompt dei comandi viene restituito, ma l'esecuzione del processo continua in background.
Wait-Job -ID 10 -Timeout 120
ARRESTO DI UN PROCESSO
Per arrestare un processo in background, utilizzare il Stop-Job
cmdlet. Il comando seguente avvia un processo per ottenere ogni voce 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 di processo a Stop-Job
.
$job | Stop-Job
ELIMINAZIONE DI UN PROCESSO
Per eliminare un processo in background, usare il Remove-Job
cmdlet. Il comando che segue elimina il processo nella $ variabile job.
Remove-Job -Job $job
ANALISI DI UN PROCESSO NON RIUSCITO
Per individuare il motivo per cui un processo non è riuscito, usare la sottoproprietà Reason dell'oggetto Job.
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:...
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 richiede le credenziali esplicite per eseguire il comando. Il valore della proprietà Reason è:
Connessione al server remoto non riuscita con il seguente messaggio di errore: accesso negato.