Wait-Job
取消命令提示符,直到会话中运行的一个或多个 Windows PowerShell 后台作业完成。
语法
SessionIdParameterSet (默认值)
Wait-Job
[-Id] <Int32[]>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
JobParameterSet
Wait-Job
[-Job] <Job[]>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
NameParameterSet
Wait-Job
[-Name] <String[]>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
InstanceIdParameterSet
Wait-Job
[-InstanceId] <Guid[]>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
StateParameterSet
Wait-Job
[-State] <JobState>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
FilterParameterSet
Wait-Job
[-Filter] <Hashtable>
[-Any]
[-Timeout <Int32>]
[-Force]
[<CommonParameters>]
说明
Wait-Job cmdlet 等待 Windows PowerShell 后台作业完成,然后显示命令提示符。 可以等到任何后台作业完成,或者直到所有后台作业都完成,并且可以设置作业的最大等待时间。
作业中的命令完成后,Wait-Job 显示命令提示符并返回作业对象,以便你可以通过管道将其传递给另一个命令。
可以使用 Wait-Job cmdlet 等待后台作业,例如使用 Start-Job cmdlet 启动的作业或 AsJob 参数 Invoke-Command cmdlet。 有关 Windows PowerShell 后台作业的详细信息,请参阅about_Jobs。
从 Windows PowerShell 3.0 开始,Wait-Job cmdlet 还会等待自定义作业类型,例如工作流作业和计划作业的实例。 若要启用 Wait-Job 等待特定类型的作业,请在运行 Get-Job cmdlet 之前将支持自定义作业类型的模块导入到会话中,无论是使用 Import-Module cmdlet 还是使用或获取模块中的 cmdlet。 有关特定自定义作业类型的信息,请参阅自定义作业类型功能的文档。
示例
示例 1:等待所有作业
PS C:\> Get-Job | Wait-Job
此命令等待会话中运行的所有后台作业完成。
示例 2:等待通过使用 Start-Job 在远程计算机上启动的作业
PS C:\> $s = New-PSSession Server01, Server02, Server03
PS C:\> Invoke-Command -Session $s -ScriptBlock {Start-Job -Name Date1 -ScriptBlock {Get-Date}}
PS C:\> $done = Invoke-Command -Session $s -Command {Wait-Job -Name Date1}
PS C:\> $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 在 $s 中每个会话中运行 启动作业。 所有作业都命名为 Date1。
第三个命令使用 Invoke-Command 运行 Wait-Job。 此命令等待每台计算机上的 Date1 作业完成。 它将生成的作业对象的集合(数组)存储在$done变量中。
第四个命令使用$done变量中作业对象的数组的 Count 属性来确定已完成的作业数。
示例 3:确定第一个后台作业何时完成
PS C:\> $s = New-PSSession (Get-Content Machines.txt)
PS C:\> $c = 'Get-EventLog -LogName System | where {$_.EntryType -eq "error" --and $_.Source -eq "LSASRV"} | Out-File Errors.txt'
PS C:\> Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {$Using:c}
PS C:\> Invoke-Command -Session $s -ScriptBlock {Wait-Job -Any}
此示例使用 Wait-Job 的任何 参数来确定当前会话中运行的许多后台作业中的第一个何时完成。 它还演示如何使用 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 范围修饰符来指示在本地计算机上定义了$c变量。 在 Windows PowerShell 3.0 中引入了 Using 作用域修饰符。 有关 使用 范围修饰符的详细信息,请参阅about_Remote_Variables(https://go.microsoft.com/fwlink/?LinkID=252653)。
第四个命令使用 Invoke-Command 在会话中运行 Wait-Job 命令。 它使用 Any 参数等待远程计算机上的第一个作业完成。
示例 4:为远程计算机上的作业设置等待时间
PS C:\> $s = New-PSSession Server01, Server02, Server03
PS C:\> $jobs = Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {Get-Date}}
PS C:\> $done = Invoke-Command -Session $s -ScriptBlock {Wait-Job -Timeout 30}
此示例演示如何使用 Wait-Job 的 Timeout 参数为远程计算机上运行的作业设置最长等待时间。
第一个命令在三台远程计算机上(Server01、Server02 和 Server03)上创建 PSSession,然后将 PSSession 对象存储在$s变量中。
第二个命令使用 Invoke-Command 在$s的每个 PSSession 对象中运行 启动作业。 它将生成的作业对象存储在$jobs变量中。
第三个命令使用 Invoke-Command 在$s的每个会话中运行 等待作业。 Wait-Job 命令确定所有命令是否在 30 秒内完成。 它使用值为 30 的 Timeout 参数来建立最长等待时间,然后将命令的结果存储在$done变量中。
在这种情况下,在 30 秒后,只有 Server02 计算机上的命令已完成。 Wait-Job 结束等待,显示命令提示符,并返回表示已完成作业的对象。
$done变量包含一个作业对象,该对象表示在 Server02 上运行的作业。
示例 5:等待多个作业之一完成
PS C:\> Wait-Job -id 1,2,5 -Any
此命令按 ID 标识三个作业,并等待其中任何一个作业完成。 当第一个作业完成时,命令提示符将返回。
示例 6:等待一段时间后,允许作业在后台继续进行。
PS C:\> Wait-Job -Name "DailyLog" -Timeout 120
此命令等待 120 秒(两分钟)完成 DailyLog 作业。 如果作业在接下来的两分钟内未完成,则命令提示符会返回,并且该作业将继续在后台运行。
示例 7:按名称等待作业
PS C:\> Wait-Job -Name "Job3"
此命令使用作业名称标识要等待的作业。
示例 8:等待本地计算机上的作业使用 Start-Job 启动
PS C:\> $j = Start-Job -ScriptBlock {Get-ChildItem *.ps1| where {$_lastwritetime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
PS C:\> $j | Wait-Job
此示例演示如何使用 Start-Job在本地计算机上启动的作业使用 Wait-Job cmdlet。
这些命令启动一个作业,用于获取上周添加或更新的 Windows PowerShell 脚本文件。
第一个命令使用 Start-Job 在本地计算机上启动后台作业。 该作业运行一个 Get-ChildItem 命令,该命令获取上周添加或更新 .ps1 文件扩展名的所有文件。
第三个命令使用 等待作业 等待作业完成。 作业完成后,该命令将显示作业对象,其中包含有关作业的信息。
示例 9:等待通过使用 Invoke-Command 在远程计算机上启动的作业
PS C:\> $s = New-PSSession Server01, Server02, Server03
PS C:\> $j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
PS C:\> $j | Wait-Job
此示例演示如何通过使用 Invoke-Command的 AsJob 参数,对远程计算机上启动的作业使用 Wait-Job。 使用 AsJob时,作业是在本地计算机上创建的,并且结果会自动返回到本地计算机,即使作业在远程计算机上运行也是如此。
此示例使用 Wait-Job 来确定是否完成了在三台远程计算机上的会话中运行的 Get-Process 命令。
第一个命令在三台计算机上创建 PSSession 对象,并将其存储在$s变量中。
第二个命令使用 Invoke-Command 在$s的三个会话中运行 Get-Process。 该命令使用 AsJob 参数异步运行命令作为后台作业。 该命令返回作业对象,就像使用 Start-Job启动的作业一样,作业对象存储在$j变量中。
第三个命令使用管道运算符 (|) 将$j中的作业对象发送到 Wait-Job cmdlet。 在这种情况下,不需要 Invoke-Command 命令,因为作业驻留在本地计算机上。
示例 10:等待具有 ID 的作业
PS C:\> Get-Job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Completed True localhost,Server01.. get-service
4 Job4 Completed True localhost dir | where
PS C:\> Wait-Job -Id 1
此命令等待 ID 值为 1 的作业。
参数
-Any
指示此 cmdlet 显示命令提示符,并在任何作业完成后返回作业对象。 默认情况下,Wait-Job 等待,直到所有指定的作业都完成,然后显示提示。
参数属性
| 类型: | SwitchParameter |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Filter
指定条件的哈希表。 此 cmdlet 等待满足哈希表中所有条件的作业。 输入一个哈希表,其中键是作业属性,值是作业属性值。
此参数仅适用于自定义作业类型,例如工作流作业和计划作业。 它不适用于标准后台作业,例如使用 Start-Job cmdlet 创建的作业。 有关此参数支持的信息,请参阅作业类型的帮助主题。
此参数是在 Windows PowerShell 3.0 中引入的。
参数属性
| 类型: | Hashtable |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
FilterParameterSet
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-Force
指示此 cmdlet 继续等待处于挂起或断开连接状态的作业。 默认情况下,当作业处于以下状态之一时,Wait-Job 返回或结束等待:
- 完成
- 已失败
- 已停止
- 已暂停
- 已断开连接
此参数是在 Windows PowerShell 3.0 中引入的。
参数属性
| 类型: | SwitchParameter |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
-Id
指定此 cmdlet 等待的作业 ID 数组。
ID 是一个整数,用于在当前会话中唯一标识作业。
它比实例 ID 更容易记住和键入,但它仅在当前会话中是唯一的。
可以键入一个或多个 ID,用逗号分隔。
若要查找作业的 ID,请键入 Get-Job。
参数属性
| 类型: | Int32[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
SessionIdParameterSet
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-InstanceId
指定此 cmdlet 等待的作业实例 ID 数组。 默认值为所有作业。
实例 ID 是一个 GUID,用于在计算机上唯一标识作业。 若要查找作业的实例 ID,请使用 Get-Job。
参数属性
| 类型: | Guid[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
InstanceIdParameterSet
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-Job
指定此 cmdlet 等待的作业。 输入包含作业对象的变量或获取作业对象的命令。 还可以使用管道运算符将作业对象发送到 Wait-Job cmdlet。 默认情况下,Wait-Job 等待当前会话中创建的所有作业。
参数属性
| 类型: | Job[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
JobParameterSet
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | True |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-Name
指定此 cmdlet 等待的作业的易记名称。
参数属性
| 类型: | String[] |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
参数集
NameParameterSet
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-State
指定作业状态。 此 cmdlet 仅等待处于指定状态的作业。 此参数的可接受值为:
- NotStarted
- 跑步
- 完成
- 已失败
- 已停止
- 封锁
- 已暂停
- 已断开连接
- 暂停中
- 停止中
有关作业状态的详细信息,请参阅 MSDN 库中 JobState 枚举。
参数属性
| 类型: | JobState |
| 默认值: | None |
| 接受的值: | NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint |
| 支持通配符: | False |
| 不显示: | False |
参数集
StateParameterSet
| Position: | 0 |
| 必需: | True |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | True |
| 来自剩余参数的值: | False |
-Timeout
指定每个后台作业的最大等待时间(以秒为单位)。 默认值 -1 指示 cmdlet 等待作业完成。 提交 Wait-Job 命令而不是 Start-Job 命令时,计时将开始。
如果超过此时间,则等待结束,并且命令提示符返回,即使作业仍在运行。 该命令不显示任何错误消息。
参数属性
| 类型: | Int32 |
| 默认值: | None |
| 支持通配符: | False |
| 不显示: | False |
| 别名: | TimeoutSec |
参数集
(All)
| Position: | Named |
| 必需: | False |
| 来自管道的值: | False |
| 来自管道的值(按属性名称): | False |
| 来自剩余参数的值: | False |
CommonParameters
此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters。
输入
System.Management.Automation.RemotingJob
你可以通过管道将作业对象传递给此 cmdlet。
输出
System.Management.Automation.PSRemotingJob
此 cmdlet 返回表示已完成作业的作业对象。 如果由于超过 Timeout 参数的值而终止等待,Wait-Job 不返回任何对象。
备注
- 默认情况下,当作业处于以下状态之一时,Wait-Job 返回或结束等待:
- 完成
- 已失败
- 已停止
- 已暂停
- 断开连接若要直接 等待作业 继续等待挂起和断开连接的作业,请使用 Force 参数。