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