Wait-Job
等待会话中运行的一个或所有 PowerShell 作业处于终止状态。
语法
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>]
说明
cmdlet Wait-Job
等待作业处于终止状态,然后再继续执行。
终止状态为:
- 已完成
- 已失败
- 已停止
- Suspended
- 已断开连接
可以等到指定的作业或所有作业都处于终止状态。 还可以使用 Timeout 参数设置作业的最大等待时间,或使用 Force 参数等待处于 或 Disconnected
状态的Suspended
作业。
作业中的命令完成后, Wait-Job
返回作业对象并继续执行。
可以使用 Wait-Job
cmdlet 来等待通过使用 Start-Job
cmdlet 或 cmdlet 的 AsJob 参数启动的 Invoke-Command
作业。 有关作业的详细信息,请参阅 about_Jobs。
从 Windows PowerShell 3.0 开始,Wait-Job
cmdlet 还会等待自定义作业类型,例如工作流作业和计划作业实例。 若要允许 Wait-Job
等待特定类型的作业,请在运行 Get-Job
cmdlet 或使用 或 获取模块中的 cmdlet Import-Module
之前,将支持自定义作业类型的模块导入会话。 有关特定的自定义作业类型的信息,请参阅自定义作业类型功能的文档。
示例
示例 1:等待所有作业
Get-Job | Wait-Job
此命令将等待会话中运行的所有作业完成。
示例 2:使用 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
此示例演示如何将 Wait-Job
cmdlet 与通过使用 cmdlet 在远程计算机上启动的作业一起使用 Start-Job
。 Start-Job
使用 Invoke-Command
cmdlet 将 和 Wait-Job
命令提交到远程计算机。
此示例使用 Wait-Job
来确定在三台不同计算机上作为作业运行的命令是否已 Get-Date
完成。
第一个命令在三台远程计算机上创建 (PSSession) 的Windows PowerShell会话,并将其存储在 变量中$s
。
第二个命令使用 Invoke-Command
在 Start-Job
中的三个会话中 $s
运行。
所有作业都命名为 Date1。
第三个命令使用 Invoke-Command
运行 Wait-Job
。 此命令等待 Date1
每台计算机上的作业完成。 它将生成的集合 (作业对象的数组) 存储在 变量中$done
。
第四个命令使用 变量中$done
作业对象数组的 Count 属性来确定已完成的作业数。
示例 3:确定第一个作业何时完成
$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}
此示例使用 的 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
运行Get-EventLog
命令。
该命令使用 Using scope 修饰符来指示 $c
变量是在本地计算机上定义的。 在 Windows PowerShell 3.0 中引入了 Using 作用域修饰符。 有关 Using scope 修饰符的详细信息,请参阅 about_Remote_Variables。
第四个Wait-Job
命令使用 Invoke-Command
在会话中运行命令。 它使用 Any 参数等待远程计算机上的第一个作业处于终止状态。
示例 4:为远程计算机上的作业设置等待时间
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>
此示例演示如何使用 的 Wait-Job
Timeout 参数设置远程计算机上运行的作业的最大等待时间。
第 一个命令 在 (Server01、Server02 和 Server03) 的三台远程计算机上创建 PSSession,然后将 PSSession 对象存储在 变量中 $s
。
第二个命令使用 Invoke-Command
在 中的每个 PSSession 对象中$s
运行Start-Job
。 它将生成的作业对象存储在 变量中 $jobs
。
第三个命令使用 Invoke-Command
在 中的每个会话中$s
运行Wait-Job
。 该 Wait-Job
命令确定所有命令是否都在 30 秒内完成。 它使用值为 30 的 Timeout 参数来确定最长等待时间,然后将命令的结果存储在 变量中 $done
。
在此示例中,30 秒后,只有 Server02 计算机上的命令完成。 Wait-Job
结束等待,返回表示已完成作业的 对象,并显示命令提示符。
变量 $done
包含一个作业对象,该对象表示在 Server02 上运行的作业。
示例 5:等待多个作业之一完成
Wait-Job -id 1,2,5 -Any
此命令按 ID 标识三个作业,并等待其中任何一个作业处于终止状态。 第一个作业完成后继续执行。
示例 6:等待一段时间,然后允许作业在后台继续
Wait-Job -Name "DailyLog" -Timeout 120
此命令等待 120 秒 (两分钟,) DailyLog 作业完成。 如果作业在接下来的两分钟内未完成,则将继续执行,作业将继续在后台运行。
示例 7:按名称等待作业
Wait-Job -Name "Job3"
此命令使用作业名称来标识要等待的作业。
示例 8:等待本地计算机上使用 Start-Job 启动的作业
$j = Start-Job -ScriptBlock {Get-ChildItem -Filter *.ps1| Where-Object {$PSItem.LastWriteTime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
$j | Wait-Job
此示例演示如何通过 Wait-Job
在本地计算机上启动的作业中使用 Start-Job
cmdlet。
这些命令启动一个可获取在上一周添加或更新的 Windows PowerShell 脚本文件的作业。
第一个命令使用 Start-Job
在本地计算机上启动作业。 作业运行一个 Get-ChildItem
命令,该命令获取上周添加或更新 .ps1 文件扩展名的所有文件。
第三个命令使用 Wait-Job
等待作业处于终止状态。 作业完成后, 命令将显示作业对象,其中包含有关作业的信息。
示例 9:使用 Invoke-Command 等待远程计算机上启动作业
$s = New-PSSession -ComputerName Server01, Server02, Server03
$j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
$j | Wait-Job
此示例演示如何 Wait-Job
使用 的 AsJob 参数对远程计算机上启动的 Invoke-Command
作业使用 。 使用 AsJob 时,作业在本地计算机上创建,并且即使作业在远程计算机上运行,结果也会自动返回到本地计算机。
此示例使用 Wait-Job
来确定在三台 Get-Process
远程计算机上的会话中运行的命令是否处于终止状态。
第一个命令在三台计算机上创建 PSSession 对象,并将其存储在 变量中 $s
。
第二个命令使用 Invoke-Command
在 Get-Process
中的三个会话中 $s
运行。
命令使用 AsJob 参数以作业方式异步运行命令。 命令返回作业对象,就像使用 Start-Job
启动的作业一样,作业对象存储在 变量中 $j
。
第三个命令使用管道运算符 (|
) 将作业对象$j
Wait-Job
发送到 cmdlet。 Invoke-Command
在这种情况下,不需要命令,因为作业驻留在本地计算机上。
示例 10:等待具有 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
此命令等待 ID 值为 1 的作业。
参数
-Any
指示此 cmdlet 返回作业对象,并在任何作业完成后继续执行。 默认情况下, Wait-Job
将等待所有指定的作业完成,然后显示提示。
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Filter
指定条件的哈希表。 此 cmdlet 等待满足哈希表中所有条件的作业。 输入一个哈希表,其中的键为作业属性,其中的值为作业属性值。
此参数仅适用于自定义作业类型,例如工作流作业和计划作业。 它不适用于标准作业,例如使用 Start-Job
cmdlet 创建的作业。 有关支持此参数的信息,请参阅作业类型的帮助主题。
已在 Windows PowerShell 3.0 中引入了此参数。
Type: | Hashtable |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Force
指示此 cmdlet 继续等待处于“挂起”或“已断开连接”状态的作业。 默认情况下, Wait-Job
当作业处于以下状态之一时,返回或结束等待:
- 已完成
- 已失败
- 已停止
- Suspended
- 已断开连接
已在 Windows PowerShell 3.0 中引入了此参数。
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Id
指定此 cmdlet 等待的作业 ID 的数组。
ID 是一个整数,用于唯一标识当前会话中的作业。 它比实例 ID 更容易记住和键入,但它仅在当前会话中是唯一的。 可以键入一个或多个 ID,用逗号分隔。 若要查找作业的 ID,请键入 Get-Job
。
Type: | Int32[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-InstanceId
指定此 cmdlet 等待的作业的实例 ID 数组。 默认值为所有作业。
实例 ID 是一个 GUID,用于在计算机上唯一标识作业。 若要查找作业的实例 ID,请使用 Get-Job
。
Type: | Guid[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Job
指定此 cmdlet 等待的作业。 输入一个包含作业对象的变量或可获取作业对象的命令。 还可以使用管道运算符将作业对象发送到 Wait-Job
cmdlet。 默认情况下, Wait-Job
等待在当前会话中创建的所有作业。
Type: | Job[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Name
指定此 cmdlet 等待的作业的友好名称。
Type: | String[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-State
指定作业状态。 此 cmdlet 仅等待处于指定状态的作业。 此参数的可接受值为:
- NotStarted
- 正在运行
- 已完成
- 已失败
- 已停止
- 已阻止
- Suspended
- 已断开连接
- 正在暂停
- 正在停止
有关作业状态的详细信息,请参阅 JobState 枚举。
Type: | JobState |
Accepted values: | NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Timeout
指定每个作业的最长等待时间(以秒为单位)。 默认值 -1 指示 cmdlet 等待作业完成。 提交命令而不是命令时 Wait-Job
开始计时 Start-Job
。
如果超过此时间,则等待结束并继续执行,即使作业仍在运行。 命令不显示任何错误消息。
Type: | Int32 |
Aliases: | TimeoutSec |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
输入
System.Management.Automation.RemotingJob
可以通过管道将作业对象传递给此 cmdlet。
输出
System.Management.Automation.PSRemotingJob
此 cmdlet 返回表示处于终止状态的作业的作业对象。 如果由于超出 Timeout 参数的值而结束等待, Wait-Job
则不会返回任何对象。
备注
PowerShell 包含以下别名 Wait-Job
:
- 所有平台:
wjb
默认情况下, Wait-Job
当作业处于以下状态之一时, 返回或结束等待:
- 已完成
- 已失败
- 已停止
- Suspended
- 已断开连接
若要直接 Wait-Job
继续等待挂起和断开连接的作业,请使用 Force 参数。