Sei sulla pagina 1di 7

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

Potrebbero piacerti anche