Wait-Job
Attende che uno o tutti i processi di lavoro di PowerShell in esecuzione nella sessione siano in uno stato di terminazione.
Sintassi
Wait-Job
[-Any]
[-Timeout <Int32>]
[-Force]
[-Id] <Int32[]>
[<CommonParameters>]
Wait-Job
[-Job] <Job[]>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
Wait-Job
[-Any]
[-Timeout <Int32>]
[-Force]
[-Name] <String[]>
[<CommonParameters>]
Wait-Job
[-Any]
[-Timeout <Int32>]
[-Force]
[-InstanceId] <Guid[]>
[<CommonParameters>]
Wait-Job
[-Any]
[-Timeout <Int32>]
[-Force]
[-State] <JobState>
[<CommonParameters>]
Wait-Job
[-Any]
[-Timeout <Int32>]
[-Force]
[-Filter] <Hashtable>
[<CommonParameters>]
Descrizione
Il cmdlet Wait-Job
attende che un job si trovi in uno stato di terminazione prima di continuare l'esecuzione.
Gli stati di terminazione sono:
- Finito
- Fallito
- Fermato
- Sospeso
- Sconnesso
È possibile attendere fino a quando un processo specificato o tutti i processi si trovano in uno stato di terminazione. È anche possibile impostare un tempo di attesa massimo per il processo usando il parametro timeout oppure usare il parametro Force per attendere un processo negli stati Suspended
o Disconnected
.
Al termine dei comandi nel processo, Wait-Job
restituisce un oggetto del processo e continua l'esecuzione.
È possibile usare il cmdlet Wait-Job
per attendere l'avvio dei processi usando il cmdlet Start-Job
o il parametro asjob di del cmdlet Invoke-Command
. Per ulteriori informazioni sui lavori, vedere about_Jobs.
A partire da Windows PowerShell 3.0, il cmdlet Wait-Job
attende anche i tipi di processi personalizzati, ad esempio processi del flusso di lavoro e istanze di processi pianificati. Per consentire Wait-Job
di attendere i processi di un determinato tipo, importare il modulo che supporta il tipo di processo personalizzato nella sessione prima di eseguire il cmdlet Get-Job
, usando il cmdlet Import-Module
oppure usando o ottenendo un cmdlet nel modulo. Per informazioni su un particolare tipo di processo personalizzato, vedere la documentazione della funzionalità del tipo di processo personalizzato.
Esempio
Esempio 1: Attendere tutti i lavori
Get-Job | Wait-Job
Questo comando attende il completamento di tutti i processi in esecuzione nella sessione.
Esempio 2: Attendere l'avvio dei processi nei computer remoti usando Start-Job
$s = New-PSSession Server01, Server02, Server03
Invoke-Command -Session $s -ScriptBlock {Start-Job -Name Date1 -ScriptBlock {Get-Date}}
$done = Invoke-Command -Session $s -Command {Wait-Job -Name Date1}
$done.Count
3
Questo esempio illustra come usare il cmdlet Wait-Job
con i processi avviati nei computer remoti usando il cmdlet Start-Job
. Entrambi i comandi Start-Job
e Wait-Job
vengono inviati al computer remoto usando il cmdlet Invoke-Command
.
Questo esempio usa Wait-Job
per determinare se un comando Get-Date
in esecuzione come processo in tre computer diversi è terminato.
Il primo comando crea una sessione di Windows PowerShell (PSSession) in ognuno dei tre computer remoti e li archivia nella variabile $s
.
Il secondo comando usa Invoke-Command
per eseguire Start-Job
in ognuna delle tre sessioni in $s
.
Tutti i lavori sono denominati Date1.
Il terzo comando usa Invoke-Command
per eseguire Wait-Job
. Questo comando attende il completamento dei processi Date1
in ogni computer. Archivia la raccolta risultante (array) di oggetti di lavoro nella variabile $done
.
Il quarto comando utilizza la proprietà Count dell'array di oggetti di processo nella variabile $done
per determinare quanti processi sono completati.
Esempio 3: Determinare quando termina il primo compito
$s = New-PSSession -ComputerName (Get-Content -Path .\Machines.txt)
$c = 'Get-EventLog -LogName System | Where-Object {$PSItem.EntryType -eq "error" --and $PSItem.Source -eq "LSASRV"} | Out-File -FilePath Errors.txt'
Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {$Using:c}
Invoke-Command -Session $s -ScriptBlock {Wait-Job -Any}
In questo esempio viene utilizzato il parametro any di Wait-Job
per determinare quando il primo di molti processi in esecuzione nella sessione corrente si trova in uno stato di terminazione. Viene inoltre illustrato come usare il cmdlet Wait-Job
per attendere il completamento dei processi remoti.
Il primo comando crea una PSSession in ognuno dei computer elencati nel file Machines.txt e memorizza gli oggetti PSSession nella variabile $s
. Il comando usa il cmdlet Get-Content
per ottenere il contenuto del file. Il comando Get-Content
è racchiuso tra parentesi per assicurarsi che venga eseguito prima del comando New-PSSession
.
Il secondo comando archivia una stringa di comando Get-EventLog
, tra virgolette, nella variabile $c
.
Il terzo comando usa Invoke-Command
cmdlet per eseguire Start-Job
in ognuna delle sessioni in $s
.
Il comando Start-Job
avvia un processo che esegue il comando Get-EventLog
nella variabile $c
.
Il comando usa il modificatore Using scope per indicare che la variabile $c
è stata definita nel computer locale. Il modificatore Using scope è stato introdotto in Windows PowerShell 3.0. Per altre informazioni sul modificatore di ambito di Using, vedere about_Remote_Variables.
Il quarto comando usa Invoke-Command
per eseguire un comando Wait-Job
nelle sessioni. Usa il parametro Any per attendere fino a quando il primo processo nei computer remoti raggiunge lo stato di terminazione.
Esempio 4: Impostare un tempo di attesa per i processi nei computer remoti
PS> $s = New-PSSession -ComputerName Server01, Server02, Server03
PS> $jobs = Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {Get-Date}}
PS> $done = Invoke-Command -Session $s -ScriptBlock {Wait-Job -Timeout 30}
PS>
In questo esempio viene illustrato come usare il parametro timeout di Wait-Job
per impostare un tempo di attesa massimo per i processi in esecuzione nei computer remoti.
Il primo comando crea un PSSession in ognuno dei tre computer remoti (Server01, Server02 e Server03) e quindi archivia gli oggetti PSSession nella variabile $s
.
Il secondo comando usa Invoke-Command
per eseguire Start-Job
in ogni oggetto PSSession in $s
. Archivia gli oggetti lavoro risultanti nella variabile $jobs
.
Il terzo comando usa Invoke-Command
per eseguire Wait-Job
in ognuna delle sessioni in $s
. Il comando Wait-Job
determina se tutti i comandi sono stati completati entro 30 secondi. Usa il parametro Timeout con un valore pari a 30 per stabilire il tempo di attesa massimo e quindi archivia i risultati del comando nella variabile $done
.
In questo caso, dopo 30 secondi, è stato completato solo il comando nel computer Server02.
Wait-Job
termina l'attesa, restituisce l'oggetto che rappresenta il processo completato e visualizza il prompt dei comandi.
La variabile $done
contiene un oggetto processo che rappresenta il processo eseguito in Server02.
Esempio 5: Attendere il completamento di uno dei diversi processi
Wait-Job -id 1, 2, 5 -Any
Questo comando identifica tre processi in base ai relativi ID e attende fino a quando uno di essi non è in uno stato di terminazione. L'esecuzione continua al termine del primo compito.
Esempio 6: Attendere un periodo, quindi consentire al processo di continuare in background
Wait-Job -Name "DailyLog" -Timeout 120
Questo comando attende 120 secondi (due minuti) affinché il processo DailyLog sia completato. Se il processo non viene completato nei due minuti successivi, l'esecuzione continua e il processo continua a essere eseguito in background.
Esempio 7: Attendere un lavoro in base al nome
Wait-Job -Name "Job3"
Questo comando usa il nome del processo per identificare il processo per il quale attendere.
Esempio 8: Attendere i processi avviati sul computer locale con Start-Job
$j = Start-Job -ScriptBlock {Get-ChildItem -Filter *.ps1 | Where-Object {$PSItem.LastWriteTime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
$j | Wait-Job
In questo esempio viene illustrato come usare il cmdlet Wait-Job
con i processi avviati nel computer locale usando Start-Job
.
Questi comandi avviano un processo che ottiene i file di script di Windows PowerShell aggiunti o aggiornati nell'ultima settimana.
Il primo comando usa Start-Job
per avviare un processo nel computer locale. Il job esegue un comando Get-ChildItem
che ottiene tutti i file con l'estensione di file .ps1 che sono stati aggiunti o aggiornati nell'ultima settimana.
Il terzo comando usa Wait-Job
per attendere finché il processo non sia in uno stato di terminazione. Al termine del processo, il comando visualizza l'oggetto processo, che contiene informazioni sul processo.
Esempio 9: Attendere l'avvio dei processi nei computer remoti usando Invoke-Command
$s = New-PSSession -ComputerName Server01, Server02, Server03
$j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
$j | Wait-Job
Questo esempio illustra come usare Wait-Job
con i processi avviati nei computer remoti utilizzando il parametro AsJob di per Invoke-Command
. Quando si usa AsJob, il processo viene creato nel computer locale e i risultati vengono restituiti automaticamente al computer locale, anche se il processo viene eseguito nei computer remoti.
Questo esempio usa Wait-Job
per determinare se un comando Get-Process
in esecuzione nelle sessioni in tre computer remoti è in uno stato di terminazione.
Il primo comando crea oggetti PSSession in tre computer e li archivia nella variabile $s
.
Il secondo comando usa Invoke-Command
per eseguire Get-Process
in ognuna delle tre sessioni in $s
.
Il comando usa il parametro AsJob per eseguire il comando in modo asincrono come processo. Il comando restituisce un oggetto processo, proprio come i processi avviati usando Start-Job
e l'oggetto processo viene archiviato nella variabile $j
.
Il terzo comando usa un operatore pipeline (|
) per inviare l'oggetto processo in $j
al cmdlet Wait-Job
. In questo caso non è necessario un comando Invoke-Command
, perché il processo si trova nel computer locale.
Esempio 10: Attendere un lavoro con un ID
Get-Job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Completed True localhost,Server01.. get-service
4 Job4 Completed True localhost dir | where
Wait-Job -Id 1
Questo comando attende il processo con un valore ID pari a 1.
Parametri
-Any
Indica che questo cmdlet restituisce l'oggetto di processo e continua l'esecuzione quando uno qualsiasi dei processi termina. Per impostazione predefinita, Wait-Job
attende il completamento di tutti i processi specificati prima di visualizzare il prompt.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Filter
Specifica una tabella hash di condizioni. Questo cmdlet attende i processi che soddisfano tutte le condizioni nella tabella hash. Immettere una tabella hash in cui le chiavi sono proprietà del processo e i valori sono valori delle proprietà del processo.
Questo parametro funziona solo su tipi di processi personalizzati, ad esempio processi del flusso di lavoro e processi pianificati. Non funziona su processi standard, ad esempio quelli creati usando il cmdlet Start-Job
. Per informazioni sul supporto per questo parametro, vedere l'argomento della guida relativo al tipo di processo.
Questo parametro è stato introdotto in Windows PowerShell 3.0.
Tipo: | Hashtable |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-Force
Indica che questo cmdlet continua ad attendere i processi nello stato Sospeso o Disconnesso. Per impostazione predefinita, Wait-Job
restituisce o termina l'attesa, quando i processi si trovano in uno degli stati seguenti:
- Finito
- Fallito
- Interrotto
- Sospeso
- Sconnesso
Questo parametro è stato introdotto in Windows PowerShell 3.0.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Id
Specifica una matrice di ID di attività per i quali questo cmdlet attende.
L'ID è un numero intero che identifica in modo univoco il lavoro nella sessione corrente. È più facile da ricordare e digitare rispetto all'ID istanza, ma è univoco solo nella sessione corrente. È possibile digitare uno o più ID, separati da virgole. Per trovare l'ID di un lavoro, digitare Get-Job
.
Tipo: | Int32[] |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-InstanceId
Specifica un array di ID delle istanze dei processi per cui questo cmdlet attende. Il valore predefinito è tutte le attività.
Un ID istanza è un GUID che identifica in modo univoco l'attività nel computer. Per trovare l'ID istanza di un processo, utilizzare Get-Job
.
Tipo: | Guid[] |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-Job
Specifica le attività per le quali il cmdlet attende. Specificare una variabile che contiene gli oggetti di processo o un comando che ottiene gli oggetti di processo. È anche possibile usare un operatore pipeline per inviare oggetti di processo al cmdlet Wait-Job
. Per impostazione predefinita, Wait-Job
attende tutti i lavori creati nella sessione corrente.
Tipo: | Job[] |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-Name
Specifica i nomi descrittivi dei lavori in attesa dei quali il cmdlet attende.
Tipo: | String[] |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-State
Specifica uno stato di lavoro. Questo cmdlet attende solo i processi nello stato specificato. I valori accettabili per questo parametro sono:
- Non Iniziato
- Corsa
- Finito
- Fallito
- Fermato
- Bloccato
- Sospeso
- Sconnesso
- Sospensione
- Fermarsi
Per altre informazioni sugli stati del processo, vedere 'enumerazione JobState.
Tipo: | JobState |
Valori accettati: | NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-Timeout
Specifica il tempo di attesa massimo per ogni processo, espresso in secondi. Il valore predefinito , -1, indica che il cmdlet attende fino al termine del processo. La temporizzazione inizia quando si invia il comando Wait-Job
, non il comando Start-Job
.
Se questo tempo viene superato, l'attesa termina e l'esecuzione continua, anche se il processo è ancora in esecuzione. Il comando non visualizza alcun messaggio di errore.
Tipo: | Int32 |
Alias: | TimeoutSec |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
Input
System.Management.Automation.RemotingJob
È possibile instradare un oggetto processo a questo cmdlet.
Output
System.Management.Automation.PSRemotingJob
Questo cmdlet restituisce oggetti processo che rappresentano i processi in uno stato di terminazione. Se l'attesa termina perché viene superato il valore del parametro timeout, Wait-Job
non restituisce alcun oggetto.
Note
PowerShell include gli alias seguenti per Wait-Job
:
- Tutte le piattaforme:
wjb
Per impostazione predefinita, Wait-Job
restituisce oppure mette fine all'attesa quando i processi si trovano in uno degli stati seguenti:
- Finito
- Fallito
- Interrotto
- Sospeso
- Sconnesso
Per indirizzare Wait-Job
a continuare ad attendere i processi Sospesi e Disconnessi, utilizzare il parametro Force.