Suppress the command prompt until one or all of the PowerShell background jobs running in the session are complete.
Syntax Wait-Job [-Id] Int32[] [-Any] [-Force] [-Timeout int] [CommonParameters] Wait-Job [-Filter] Hashtable [-Any] [-Force] [-Timeout Int32] [CommonParameters] Wait-Job [[-InstanceId] Guid[]] [-Any] [-Force] [-Timeout int] [CommonParameters] Wait-Job [-Job] Job[] [-Any] [-Force] [-Timeout int] [CommonParameters] Wait-Job [[-Name] string[]] [-Any] [-Force] [-Timeout int] [CommonParameters] Wait-Job [-State {NotStarted | Running | Completed | Failed | Stopped | Blocked}] [-Any] [-Force] [-Timeout int] [CommonParameters] Key -Any Display the command prompt (and return the job object) when any job completes. By default, Wait-Job waits until all of the specified jobs are complete. -Filter Hashtable Wait for jobs that satisfy all of the conditions established in the associated hash table. Enter a hash table where the keys are job properties and the values are job property values. This parameter works only on custom job types, such as workflow jobs and scheduled jobs. It does not work on standard background jobs, such as those created by using Start-Job. (PowerShell 3.0+) -Id Int32[] Wait for jobs with the specified IDs. The ID is an integer that uniquely identifies the job within the current session. It is easier to remember and to type than the instance ID, but it is unique only within the current session. You can type one or more IDs (separated by commas). To find the ID of a job, type "Get-Job" without parameters. -InstanceId Guid[] Wait for jobs with the specified instance IDs. An instance ID is a GUID that uniquely identifies the job on the computer. To find the instance ID of a job, use Get-Job. -Job Job[] The the jobs to be deleted. Enter a variable that contains the job or a command that gets the job. You can also pipe a job object to Receive-Job. -Name string[] Wait for jobs with the specified friendly name(s). -State JobState Wait for jobs with the specified status. Valid values are NotStarted, Running, Completed, Stopped, Failed, and Blocked. -Force Continue waiting if jobs are in the Suspended or Disconnected state. By default, Wait-Job returns (terminates the wait) when jobs are in one of the following states: Completed, Failed, Stopped, Suspended, or Disconnected. (PowerShell 3.0+) -Timeout int
The maximum wait time for each background job, in seconds. The default, -1, waits until the job completes, no matter how long it runs. The timing starts when you submit the Wait-Job command.
If this time is exceeded, the wait will end and the command prompt returns, even if the job is still running. No error message is displayed. CommonParameters: -Verbose, -Debug, -ErrorAction, -ErrorVariable, -WarningAction, -WarningVariable, -OutBuffer -OutVariable.
Standard Aliases for Wait-Job: wjb
Wait-Job waits for PowerShell background jobs to complete before it displays the command prompt.
The wait can be for all background jobs or for specific job(s), a maximum wait time can also be set.
When the commands in the job are complete, Wait-Job will display the command prompt and return a job object that can be piped to another command.
Examples
Wait for all background jobs running in the session to complete:
PS C:\> get-job | wait-job
Use Wait-Job to determine whether a command running as a background job on three different computers is complete:
PS C:\> $sess = new-pssession server01, server02, server03
PS C:\> invoke-command -session $sess -scriptblock {start-job -name Date1 -scriptblock {get-date}}
PS C:\> $done = invoke-command -session $sess -command {wait-job -name Date1}
PS C:\> $done.count
3
Use Wait-Job to determine when the first of many background jobs running in the current session are complete (local jobs running on remote machines):
PS C:\> $sess = new-pssession (get-content machines.txt)
PS C:\> $commands = 'get-eventlog -log system | where {$_.EntryType -eq "error" -and $_.Source -eq "LSASRV"} | out-file errors.txt'
PS C:\> invoke-command -session $sess -scriptblock {param($commands)start-job -scriptblock {$commands}} -ArgumentList $commands
PS C:\> invoke-command -session $sess -scriptblock {wait-job -any}
Identify three jobs by their IDs and wait until any of them are complete:
PS C:\> wait-job -id 1,2,7 -any
Wait 120 seconds (two minutes) for the ss64 job to complete:
PS C:\> wait-job -name ss64 -timeout 120
Run a Get-Process command in each of three PSSessions against remote machines, using -AsJob, the job is created on the local computer and the results are automatically returned to the local computer, the Wait will return when all 3 jobs are complete:
PS C:\> $sess = new-pssession Server64, Server65, Server66
PS C:\> $myjob = invoke-command -session $sess -scriptblock {get-process} -asjob
PS C:\> $myjob | wait-job
“A girl can wait for the right man to come along but in the meantime that still doesn't mean she can't have a wonderful time with all the wrong ones” ~ Cher
Related PowerShell Cmdlets:
Get-Job - Get PowerShell background jobs that are running.
Invoke-Command - Run command.
Stop-Job - Stop a PowerShell background job.
Wait-Event - Wait until a particular event is raised.
Wait-Process - Wait for a process to stop.