ARGOMENTO
about_Jobs
DESCRIZIONE BREVE
Fornisce informazioni sul modo in cui i processi in background
eseguono un comando o un'espressione in background senza
interagire con la sessione corrente.
DESCRIZIONE DETTAGLIATA
In questo argomento viene illustrato come eseguire processi in
background in Windows 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, viene immediatamente
visualizzato il prompt dei comandi, anche se il completamento del
processo richiede più tempo. Durante l'esecuzione del processo, è
possibile continuare a lavorare nella sessione senza interruzione.
Importante: i processi in background avviati mediante il
parametro Start-Job o AsJob di Invoke-Command sono basati
sull'infrastruttura remota di Windows PowerShell. Per utilizzare
queste funzionalità, è necessario configurare Windows PowerShell
per la comunicazione remota, anche se il processo in background
viene eseguito unicamente nel computer locale. Per ulteriori
informazioni, vedere about_Remote_Requirements.
MODALITÀ DI AVVIO DI UN PROCESSO NEL COMPUTER LOCALE
Per avviare un processo in background nel computer locale,
utilizzare il cmdlet Start-Job.
Per scrivere un comando Start-Job, racchiudere il comando eseguito dal
processo tra parentesi graffe ( { } ). Utilizzare 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 relativi risultati.
Salvare l'oggetto processo in una variabile, quindi utilizzarlo
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}
È inoltre possibile utilizzare il cmdlet Get-Job per ottenere
oggetti che rappresentano i processi avviati nella sessione
corrente. Get-Job restituisce lo stesso oggetto processo
restituito da Start-Job.
OTTENERE OGGETTI PROCESSO
Per ottenere oggetti che rappresentano i processi in background
avviati nella sessione corrente, utilizzare il cmdlet Get-Job. Senza i
parametri, Get-Job restituisce tutti i processi avviati nella
sessione corrente.
Ad esempio, il comando seguente ottiene i processi nella sessione
corrente.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost get-process
È inoltre possibile salvare l'oggetto processo in una variabile e
utilizzarlo 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 è stato completato o meno. Un processo completato
presenta lo stato "Complete" o "Failed". È inoltre possibile che
un processo sia bloccato o in esecuzione.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
OTTENERE I RISULTATI DI UN PROCESSO
Quando si esegue un processo in background, i risultati non vengono
visualizzati immediatamente. Il cmdlet Start-Job restituisce invece
un oggetto processo che rappresenta il processo, ma non contiene i
risultati. Per ottenere i risultati di un processo in background,
utilizzare il cmdlet Receive-Job.
Il comando seguente utilizza il cmdlet Receive-Job per ottenere i
risultati del processo. Utilizza 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 i risultati del processo
presenti nella variabile $job nella variabile $results.
$results = receive-job -job $job
È altresì possibile salvare i risultati del processo in un file
mediante l'operatore di rendirizzamento (>) o il cmdlet
Out-File. Il comando seguente utilizza l'operatore di
reindirizzamento per salvare i risultati del processo presenti
nella variabile $job nel file Results.txt.
receive-job -job $job > results.txt
OTTENERE E MANTENERE RISULTATI PARZIALI DI PROCESSO
Il cmdlet Receive-Job restituisce i risultati di un processo in
background. Se il processo è completo, Receive-Job restituisce lo
stato Complete del processo. Se il processo è ancora in
esecuzione, Receive-Job ottiene i risultati generati fino a
questo momento. È possibile eseguire nuovamente i comandi
Receive-Job per ottenere i risultati rimanenti.
Quando Receive-Job restituisce risultati, per impostazione
predefinita vengono eliminati i risultati dalla cache in cui sono
archiviati i risultati del processo. Se si esegue un altro
comando Receive-Job, si ottengono unicamente i risultati non
ancora ricevuti.
Mediante i comandi seguenti vengono mostrati 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 i risultati del processo restituiti vengano eliminati
mediante Receive-Job, utilizzare il parametro Keep. Di conseguenza,
Receive-Job restituisce tutti i risultati generati fino a questo momento.
Mediante i comandi seguenti viene mostrato l'effetto dell'utilizzo del
parametro Keep su 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 il cui completamento richiede tempo, è
possibile utilizzare le proprietà dell'oggetto processo per
determinare quando il processo è completato. Il comando seguente
utilizza 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 State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
2 Job2 Running True localhost get-eventlog -log syst...
3 Job3 Complete True localhost dir -path c:\* -recurse
In questo caso, la proprietà State rivela che Job 2 è ancora in
esecuzione. Se si dovesse utilizzare il cmdlet Receive-Job per
ottenere ora i risultati del processo, tali risultati sarebbero
incompleti. È possibile utilizzare il cmdlet Receive-Job
ripetutamente per ottenere tutti i risultati. Per impostazione
predefinita, ogni volta che viene utilizzato, si ottengono
unicamente i risultati non ancora ricevuti, anche se è possibile
utilizzare il parametro Keep del cmdlet Receive-Job per mantenere
i risultati, anche se sono già stati ricevuti.
A questo punto, è possibile scrivere i risultati su un file e
aggiungere i risultati man mano che vengono ricevuti. In
alternativa, è possibile attendere e controllare lo stato del
processo in un secondo momento.
È inoltre possibile utilizzare il cmdlet Wait-Job per attendere
altri o tutti i risultati del processo. Wait-Job consente di
attendere un particolare processo, tutti i processi o tutti
quelli che devono essere completati.
Il comando seguente utilizza il cmdlet Wait-Job per attendere un
processo con ID 10.
wait-job -ID 10
Di conseguenza, il prompt di Windows PowerShell viene eliminato
finché il processo non viene completato.
È inoltre possibile attendere un periodo di tempo prestabilito.
Questo comando utilizza il parametro Timeout per limitare
l'attesa a 120 secondi. Alla scadenza del tempo, il prompt dei
comandi viene nuovamente visualizzato, 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, utilizzare il cmdlet
Stop-Job. Il comando seguente avvia un processo per ottenere ogni
voce del registro eventi di sistema. L'oggetto processo viene
salvato nella variabile $job.
$job = start-job -scriptblock {get-eventlog -log system}
Il comando seguente arresta il processo. Viene utilizzato un operatore
pipeline (|) per inviare a Stop-Job il processo presente nella
variabile $job.
$job | stop-job
ELIMINAZIONE DI UN PROCESSO
Per eliminare un processo in background, utilizzare il cmdlet
Remove-Job. Il comando consente elimina il processo nella
variabile $job.
remove-job -job $job
ANALISI DELLE CAUSE DEL MANCATO COMPLETAMENTO DI UN PROCESSO
Per capire perché un processo non è stato completato, utilizzare la
sottoproprietà Reason dell'oggetto processo.
Il comando seguente avvia un processo senza le credenziali necessarie.
L'oggetto processo viene salvato nella variabile $job.
$job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost new-item -path HKLM:\S...
Il comando seguente utilizza la proprietà Reason per trovare
l'errore che ha impedito il completamento del processo.
$job.ChildJobs[0].JobStateInfo.Reason
In questo caso, il processo non è stato completato perché nel
computer remoto sono state richieste credenziali esplicite per
l'esecuzione del comando. Il valore della proprietà Reason è:
Connessione al server remoto non riuscita con il seguente
messaggio di errore: Accesso negato.
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 finché uno o tutti i processi
non sono stati completati.
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
utilizzare Invoke-Command per eseguire in modalità remota
qualsiasi comando di processo, incluso un comando Start-Job.
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