Wait-Job
禁止显示命令提示符,直至在会话中运行的一个或全部 Windows PowerShell 后台作业完成。
语法
Wait-Job [[-InstanceId] <Guid[]>] [-Any] [-Timeout <int>] [<CommonParameters>]
Wait-Job [-Job] <Job[]> [-Any] [-Timeout <int>] [<CommonParameters>]
Wait-Job [[-Name] <string[]>] [-Any] [-Timeout <int>] [<CommonParameters>]
Wait-Job [-Id] <Int32[]> [-Any] [-Timeout <int>] [<CommonParameters>]
Wait-Job [-State {<NotStarted> | <Running> | <Completed> | <Failed> | <Stopped> | <Blocked>}] [-Any] [-Timeout <int>] [<CommonParameters>]
说明
Wait-Job cmdlet 会等待 Windows PowerShell 后台作业完成,然后再显示命令提示符。可以等待某一个后台作业完成或所有后台作业完成,并可为作业设置最长等待时间。
可以使用 Wait-Job 来获取通过使用 Start-Job 或 Invoke-Command 的 AsJob 参数启动的后台作业。
当作业中的命令完成时,Wait-Job 将显示命令提示符并返回作业对象,这样您就可以将该对象通过管道传递给另一个命令。
参数
-Any
作业完成时显示命令提示符(并返回作业对象)。默认情况下,Wait-Job 等到所有指定的作业都完成后才显示提示。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Id <Int32[]>
等待具有指定 ID 的作业。
ID 是一个整数,用于在当前会话中唯一标识作业。它比 InstanceId 更容易记住和键入,但它仅仅在当前会话中是唯一的。可以键入一个或多个 ID(以逗号分隔)。要查找作业的 ID,请键入不带参数的“Get-Job”。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-InstanceId <Guid[]>
等待具有指定实例 ID 的作业。默认值为所有作业。
实例 ID 是一个 GUID,用于在计算机上唯一地标识作业。若要查找作业的实例 ID,请使用 Get-Job。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-Job <Job[]>
等待指定的作业。请输入包含作业对象的变量或获取作业对象的命令。也可以使用管道运算符将作业对象发送到 Wait-Job cmdlet。默认情况下,Wait-Job 等待在当前会话中创建的所有作业。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByValue, ByPropertyName) |
是否接受通配符? |
false |
-Name <string[]>
等待具有指定友好名称的作业。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-State <JobState>
等待处于指定状态的作业。有效值是 NotStarted、Running、Completed、Stopped、Failed 和 Blocked。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-Timeout <int>
确定每个后台作业的最长等待时间(以秒为单位)。默认值为 -1,即等待作业完成,而不管作业运行多长时间。计时从您提交 Wait-Job 命令时开始,而不是从提交 Start-Job 命令时开始。
如果超过此时间,则等待结束,命令提示符返回,即使作业仍然在运行也是如此。不显示错误消息。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
System.Management.Automation.RemotingJob 可将作业对象通过管道传递给 Wait-Job。 |
输出 |
System.Management.Automation.RemotingJob Wait-Job 返回表示已完成作业的作业对象。如果等待由于超过 Timeout 参数的值而终止,则 Wait-Job 不会返回任何对象。 |
示例 1
C:\PS>get-job | wait-job
说明
-----------
此命令等待在会话中运行的所有后台作业完成。
示例 2
C:\PS>$s = new-pssession server01, server02, server03
C:\PS> invoke-command -session $s -scriptblock {start-job -name Date1 -scriptblock {get-date}}
C:\PS> $done = invoke-command -session $s -command {wait-job -name Date1}
C:\PS> $done.count
3
说明
-----------
此示例说明如何使用 Wait-Job cmdlet 来处理通过使用 Start-Job cmdlet 在远程计算机上启动的作业。Start-Job 和 Wait-Job 命令都通过使用 Invoke-Command cmdlet 提交到远程计算机。
此示例使用 Wait-Job 来确定在三台不同计算机上作为后台作业运行的 Get-Date 命令是否完成。
第一个命令在所有三台远程计算机上创建 Windows PowerShell 会话 (PSSession),并将这些会话存储在 $s 变量中。
第二个命令使用 Invoke-Command cmdlet 在 $s 中的所有三个会话中运行 Start-Job 命令。所有作业都被命名为 Date1。
第三个命令使用 Invoke-Command cmdlet 来运行 Wait-Job 命令。此命令等待每台计算机上 Date1 作业的完成。它将生成的作业对象集合(数组)存储在 $done 变量中。
第四个命令使用 $done 变量中的作业对象数组的 Count 属性来确定有多少作业完成了。
示例 3
C:\PS>$s = new-pssession (get-content machines.txt)
C:\PS> $c = 'get-eventlog -log system | where {$_.EntryType -eq "error" -and $_.Source -eq "LSASRV"} | out-file errors.txt'
C:\PS> invoke-command -session $s -scriptblock {param($c)start-job -scriptblock {$c}} -ArgumentList $c
C:\PS> invoke-command -session $s -scriptblock {wait-job -any}
说明
-----------
此示例使用 Wait-Job 的 Any 参数来确定在当前会话中运行的大量后台作业中的第一个作业何时完成。它还说明如何使用 Wait-Job cmdlet 等待远程作业完成。
第一个命令在 Machines.txt 文件中列出的每台计算机上创建 PSSession,并将 PSSession 存储在 $s 变量中。该命令使用 Get-Content cmdlet 获取文件的内容。Get-Content 命令括在圆括号中,以确保它在 New-PSSession 命令之前运行。
第二个命令将 Get-EventLog 命令字符串(括在引号内)存储在 $c 变量中。
第三个命令使用 Invoke-Command cmdlet 在 $s 中的每个会话中运行 Start-Job 命令。Start-Job 命令启动一个运行 $c 中的命令的后台作业。
由于 $c 变量在本地计算机上,因此该命令使用“param”关键字声明命令中的局部变量,并使用 ArgumentList 参数提供这些变量的值。
第四个命令使用 Invoke-Command cmdlet 在会话中运行 Wait-Job 命令。该命令使用 Wait-Job cmdlet 来等待远程计算机上的第一个作业完成。
示例 4
C:\PS>$s = new-pssession Server01, Server02, Server03
C:\PS> $jobs = invoke-command -session $s -scriptblock {start-job -script {get-date}}
C:\PS> $done = invoke-command -session $s -scriptblock {wait-job -timeout 30}
说明
-----------
此示例说明如何使用 Wait-Job 的 Timeout 参数设置在远程计算机上运行的作业的最长等待时间。
第一个命令在所有三台远程计算机(Server01、Server02 和 Server03)上创建 PSSession,并将这些 PSSession 保存在 $s 变量中。
第二个命令使用 Invoke-Command cmdlet 在 $s 中的每个 PSSession 中运行 Start-Job 命令。此命令将生成的作业对象保存在 $jobs 变量中。
第三个命令使用 Invoke-Command cmdlet 在 $s 中的每个 PSSession 中运行 Wait-Job 命令。Wait-Job 命令确定所有命令是否都已在 30 秒内完成。该命令使用值为 30(秒)的 Timeout 参数确立最长等待时间,并将命令的结果保存在 $done 变量中。
在本例中,30 秒后,只有 Server02 计算机上的命令完成。Wait-Job 终止等待,显示命令提示符,并返回表示已完成的作业的对象。
$done 变量包含表示在 Server02 上运行的作业的作业对象。
示例 5
C:\PS>wait-job -id 1,2,5 -any
说明
-----------
此命令通过 ID 标识三个作业,并等待其中任何一个作业完成。当第一个作业完成时,命令提示符返回。
示例 6
C:\PS>wait-job -name DailyLog -timeout 120
说明
-----------
此命令等待 DailyLog 作业完成,等待时间为 120 秒(2 分钟)。如果作业未在接下来的 2 分钟之内完成,则命令提示符返回,作业继续在后台运行。
示例 7
C:\PS>wait-job -name Job3
说明
-----------
此 Wait-Job 命令使用作业名称来标识要等待的作业。
示例 8
C:\PS>C:\PS> $j = start-job -script {get-childitem *.ps1| where {$_lastwritetime -gt ((get-date) - (new-timespan -days 7))}}
C:\PS> $j | wait-job
说明
-----------
此示例说明如何使用 Wait-Job cmdlet 来处理通过使用 Start-Job cmdlet 在本地计算机上启动的作业。
这些命令启动一个获取在上一周添加或更新的 Windows PowerShell 脚本文件的作业。
第一个命令使用 Start-Job cmdlet 在本地计算机上启动后台作业。该作业运行 Get-ChildItem 命令,后者获取在上一周添加或更新的文件扩展名为“ps1”的所有文件。
第三个命令使用 Wait-Job cmdlet 来等待作业完成。作业完成时,该命令显示包含有关作业的信息的作业对象。
示例 9
C:\PS>$s = new-pssession Server01, Server02, Server03
C:\PS> $j = invoke-command -session $s -scriptblock {get-process} -asjob
C:\PS> $j | wait-job
说明
-----------
此示例说明如何使用 Wait-Job cmdlet 来处理通过使用 Invoke-Command cmdlet 的 AsJob 参数在远程计算机上启动的作业。使用 AsJob 时,作业是在本地计算机上创建的,结果也自动返回到本地计算机,即使作业运行在远程计算机上也是如此。
此示例使用 Wait-Job 来确定在三台远程计算机上的会话中运行的 Get-Process 命令是否完成。
第一个命令在三台计算机上创建 PSSession 并将它们存储在 $s 变量中。
第二个命令使用 Invoke-Command cmdlet 在 $s 中的所有三个 PSSession 中运行 Get-Process 命令。此命令使用 AsJob 参数将命令作为后台作业异步运行。此命令返回一个作业对象(就像通过使用 Start-Job 启动的作业),并将该作业对象存储在 $j 变量中。
第三个命令使用管道运算符 (|) 将 $j 中的作业对象发送到 Wait-Job cmdlet。请注意,此示例中不需要 Invoke-Command 命令,因为作业驻留在本地计算机上。
示例 10
C:\PS>get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Completed True localhost,server01.. get-service
4 Job4 Completed True localhost dir | where
C:\PS> wait-job -id 1
说明
-----------
此命令等待 ID 值为 1 的作业。
另请参阅
概念
about_Jobs
about_Job_Details
about_Remote_Jobs
Start-Job
Get-Job
Receive-Job
Stop-Job
Remove-Job
Invoke-Command