当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Wait-Job (Microsoft.PowerShell.Core)

作者:精品下载站 日期:2024-12-14 02:13:41 浏览:14 分类:玩电脑

Wait-Job (Microsoft.PowerShell.Core)


Wait-Job

模块 :Microsoft.PowerShell.Core

等待,直到会话中运行的一个或所有 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>]

描述

Wait-Job cmdlet 在继续执行之前等待作业处于终止状态。终止状态是:

  • 完全的
  • 失败的
  • 已停止
  • 暂停
  • 已断开连接

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

当作业中的命令完成时,Wait-Job 返回一个作业对象并继续执行。

您可以使用 Wait-Job cmdlet 等待使用 Start-Job cmdlet 或 AsJob 参数启动的作业Invoke-Command cmdlet。有关职位的更多信息,请参阅 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 以及通过使用 Start-Job cmdlet 在远程计算机上启动的作业。 Start-JobWait-Job 命令均通过使用 Invoke-Command cmdlet 提交到远程计算机。

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

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

第二个命令使用 Invoke-Command$s 中的三个会话中的每一个中运行 Start-Job。所有作业均命名为 Date1。

第三个命令使用 Invoke-Command 运行 Wait-Job。此命令等待每台计算机上的 Date1 作业完成。它将 job 对象的结果集合(数组)存储在 $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-JobAny 参数来确定当前会话中运行的众多作业中的第一个作业何时处于终止状态。它还演示了如何使用 Wait-Job cmdlet 等待远程作业完成。

第一个命令在 Machines.txt 文件中列出的每台计算机上创建一个 PSSession,并将 PSSession 对象存储在 $s 变量中。该命令使用 Get-Content cmdlet 来获取文件的内容。 Get-Content 命令包含在括号中,以确保它在 New-PSSession 命令之前运行。

第二个命令将 Get-EventLog 命令字符串(用引号引起来)存储在 $c 变量中。

第三条命令使用 Invoke-Command cmdlet 在 $s 中的每个会话中运行 Start-JobStart-Job 命令启动一个作业,该作业在 $c 变量中运行 Get-EventLog 命令。

该命令使用 Using 范围修饰符来指示 $c 变量是在本地计算机上定义的。 Using 范围修饰符是在 Windows PowerShell 3.0 中引入的。有关使用范围修饰符的详细信息,请参阅 about_Remote_Variables。

第四个命令使用 Invoke-Command 在会话中运行 Wait-Job 命令。它使用 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-JobTimeout 参数来设置远程计算机上运行的作业的最长等待时间。

第一个命令在三台远程计算机(Server01、Server02 和 Server03)中的每台计算机上创建一个 PSSession,然后将 PSSession 对象存储在 $s变量。

第二个命令使用 Invoke-Command$s 中的每个 PSSession 对象中运行 Start-Job。它将生成的作业对象存储在 $jobs 变量中。

第三个命令使用 Invoke-Command$s 中的每个会话中运行 Wait-JobWait-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 与通过使用 Invoke-CommandAsJob 参数在远程计算机上启动的作业结合使用。使用AsJob时,作业是在本地计算机上创建的,并且结果会自动返回到本地计算机,即使作业在远程计算机上运行也是如此。

此示例使用 Wait-Job 来确定在三台远程计算机上的会话中运行的 Get-Process 命令是否处于终止状态。

第一个命令在三台计算机上创建 PSSession 对象并将它们存储在 $s 变量中。

第二个命令使用 Invoke-Command$s 中的三个会话中的每一个中运行 Get-Process。该命令使用 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 会等待所有指定作业完成后才显示提示。

类型 :

SwitchParameter

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Filter

指定条件的哈希表。此 cmdlet 等待满足哈希表中所有条件的作业。输入一个哈希表,其中键是作业属性,值是作业属性值。

此参数仅适用于自定义作业类型,例如工作流作业和计划作业。它不适用于标准作业,例如使用 Start-Job cmdlet 创建的作业。有关此参数支持的信息,请参阅作业类型的帮助主题。

此参数是在 Windows PowerShell 3.0 中引入的。

类型 :

哈希表

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-Force

指示此 cmdlet 继续等待处于挂起或断开连接状态的作业。默认情况下,当作业处于以下状态之一时,Wait-Job 返回或结束等待:

  • 完全的
  • 失败的
  • 已停止
  • 暂停
  • 已断开连接

此参数是在 Windows PowerShell 3.0 中引入的。

类型 :

SwitchParameter

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Id

指定此 cmdlet 等待的作业 ID 数组。

ID 是一个整数,唯一标识当前会话中的作业。它比实例 ID 更容易记住和输入,但它仅在当前会话中是唯一的。您可以键入一个或多个 ID,以逗号分隔。要查找作业的 ID,请输入 Get-Job

类型 :

Int32[]

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-InstanceId

指定此 cmdlet 等待的作业的实例 ID 数组。默认为所有作业。

实例 ID 是唯一标识计算机上作业的 GUID。要查找作业的实例 ID,请使用 Get-Job

类型 :

指导[]

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-Job

指定此 cmdlet 等待的作业。输入包含作业对象的变量或获取作业对象的命令。您还可以使用管道运算符将作业对象发送到 Wait-Job cmdlet。默认情况下,Wait-Job 等待当前会话中创建的所有作业。

类型 :

工作[]

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-Name

指定此 cmdlet 等待的作业的友好名称。

类型 :

String[]

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-State

指定作业状态。此 cmdlet 仅等待处于指定状态的作业。该参数可接受的值为:

  • NotStarted
  • 跑步
  • 完全的
  • 失败的
  • 已停止
  • 被阻止
  • 暂停
  • 已断开连接
  • 暂停
  • 停止

有关作业状态的更多信息,请参阅 JobState 枚举。

类型 :

JobState

接受的值:

未启动、正在运行、已完成、失败、已停止、已阻止、已挂起、已断开连接、挂起、正在停止、AtBreakpoint

位置:

0

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-Timeout

指定每个作业的最长等待时间(以秒为单位)。默认值 -1 表示 cmdlet 等待作业完成。计时从您提交 Wait-Job 命令开始,而不是从 Start-Job 命令开始。

如果超过此时间,即使作业仍在运行,等待也会结束并继续执行。该命令不显示任何错误消息。

类型 :

整数32

别名:

TimeoutSec

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

输入

System.Management.Automation.RemotingJob

您可以通过管道将作业对象传递给此 cmdlet。

输出

System.Management.Automation.PSRemotingJob

此 cmdlet 返回表示处于终止状态的作业的作业对象。如果由于超过 Timeout 参数的值而导致等待结束,则 Wait-Job 不会返回任何对象。

笔记

PowerShell 包含以下 Wait-Job 别名:

  • 所有平台:

      wjb

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

    • 完全的
    • 失败的
    • 已停止
    • 暂停
    • 已断开连接

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

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯