Wait-Job

等待会话中运行的一个或多个 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 等待作业处于终止状态,然后再继续执行。 终止状态为:

  • 已完成
  • Failed
  • 已停止
  • 已暂停
  • Disconnected

可以等到指定作业或所有作业处于终止状态。 还可以使用 Timeout 参数为作业设置最长等待时间,或使用 Force 参数等待作业处于 Suspended 或 Disconnected 状态。

作业中的命令完成后, 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 之前,先将支持自定义作业类型的模块导入到会话中,方法是使用 Import-Module cmdlet 或在模块中获取 cmdlet。 有关特定自定义作业类型的信息,请参阅自定义作业类型功能的文档。

示例

示例 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 作业使用 cmdlet。 这两个命令 Start-Job 都 Wait-Job 通过使用 Invoke-Command cmdlet 提交到远程计算机。

此示例用于 Wait-Job 确定是否 Get-Date 完成了三台不同计算机上作为作业运行的命令。

第一个命令在三台远程计算机上创建Windows PowerShell 会话(PSSession),并将其存储在 $s 变量中。

第二个命令用于Invoke-Command在三个会话中的每个会话中$s运行Start-Job。 所有作业都命名为 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}

此示例使用 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命令启动在变量中运行命令的Get-EventLog$c作业。

该命令使用 Using: 范围修饰符指示变量 $c 是在本地计算机上定义的。 Windows PowerShell 3.0 中引入了 Using: 范围修饰符。 有关 Using: 范围修饰符的详细信息,请参阅 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>

此示例演示如何使用 Timeout 参数 Wait-Job 为远程计算机上运行的作业设置最长等待时间。

第一个命令在三台远程计算机上(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 cmdlet 和在本地计算机上启动的作业。Start-Job

这些命令启动一个作业,用于获取上周添加或更新的 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在三个会话中的每个会话中$s运行Get-Process。 该命令使用 AsJob 参数以异步方式作为作业运行命令。 该命令返回一个作业对象,就像使用 Start-Job作业启动的作业一样,作业对象存储在变量中 $j 。

第三个命令使用管道运算符 (|) 将作业对象$jWait-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 等待所有指定作业完成。

参数属性

类型: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 返回或结束等待:

  • 已完成
  • Failed
  • 已停止
  • 已暂停
  • Disconnected

此参数是在 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 仅等待处于指定状态的作业。 此参数的可接受值为:

  • 未开始
  • Running
  • 已完成
  • Failed
  • 已停止
  • Blocked
  • 已暂停
  • Disconnected
  • 暂停中
  • 停止中

有关作业状态的详细信息,请参阅 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 等待作业完成。 提交命令Start-Job而不是命令时Wait-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 则不返回任何对象。

备注

PowerShell 包含以下与 Wait-Job相关的别名:

  • 所有平台:
    • wjb

默认情况下,当作业处于以下状态之一时, Wait-Job 返回或结束等待:

  • 已完成
  • Failed
  • 已停止
  • 已暂停
  • Disconnected

若要直接 Wait-Job 继续等待挂起和断开连接的作业,请使用 Force 参数。