Get-Job

获取在当前会话中运行的 PowerShell 后台作业。

语法

Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [[-Id] <Int32[]>]
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-InstanceId] <Guid[]>
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-Name] <String[]>
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-State] <JobState>
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-Command <String[]>]
   [<CommonParameters>]
Get-Job
   [-Filter] <Hashtable>
   [<CommonParameters>]

说明

Get-Job cmdlet 可获取表示在当前会话中启动的后台作业的对象。 可以使用 Get-Job 获取通过使用 Start-Job cmdlet 或使用任何 cmdlet 的 AsJob 参数启动的作业。

如果没有参数,则 Get-Job 命令获取当前会话中的所有作业。 可以使用 Get-Job 的参数获取特定作业。

Get-Job 返回的作业对象包含有关该作业的有用信息,但不包含作业结果。 若要获取结果,请使用 Receive-Job cmdlet。

Windows PowerShell 后台作业是在后台运行的命令,不与当前会话进行交互。 通常,可以使用后台作业来运行需要花较长时间才能完成的复杂命令。 有关 Windows PowerShell 中的后台作业的详细信息,请参阅 about_Jobs

从 Windows PowerShell 3.0 开始,Get-Job cmdlet 还可获取自定义作业类型,例如工作流作业和计划作业的实例。 若要查找作业的作业类型,请使用该作业的 PSJobTypeName 属性。

若要使 Get-Job 能够获取自定义作业类型,可在运行 Get-Job 命令之前,使用 Import-Module cmdlet 或者使用或获取模块中的 cmdlet,将支持自定义作业类型的模块导入到会话中。 有关特定的自定义作业类型的信息,请参阅自定义作业类型功能的文档。

示例

示例 1:获取在当前会话中启动的所有后台作业

此命令将获取在当前会话中启动的所有后台作业。 它不包括在其他会话中创建的作业,即使这些作业是在本地计算机上运行的也是如此。

Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Completed     True            localhost             $env:COMPUTERNAME

示例 2:通过使用实例 ID 停止作业

这些命令演示如何获取作业的实例 ID,然后用它来停止作业。 与非唯一的作业名称不同,实例 ID 是唯一的。

第一个命令使用 Get-Job cmdlet 来获取作业。 它使用 Name 参数来标识作业。 该命令将 Get-Job 返回的作业对象存储在 $j 变量中。 在此示例中,只有一个作业具有指定的名称。 第二个命令获取 $j 变量中的对象的 InstanceId 属性,并将它存储在 $ID 变量中。 第三个命令显示 $ID 变量的值。 第四个命令使用 Stop-Job cmdlet 停止作业。 它使用 InstanceId 参数来标识作业,并使用 $ID 变量来表示作业的实例 ID。

$j = Get-Job -Name Job1
$ID = $j.InstanceID
$ID

Guid
----
03c3232e-1d23-453b-a6f4-ed73c9e29d55

Stop-Job -InstanceId $ID

示例 3:获取包含特定命令的作业

此命令获取系统中包括 Get-Process 命令的作业。 该命令使用 Get-JobCommand 参数来限制检索的作业。 该命令使用通配符 (*) 来获取命令字符串内任意位置上包含 Get-Process 命令的作业。

Get-Job -Command "*Get-Process*"

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
3      Job3            BackgroundJob   Running       True            localhost            Get-Process

示例 4:通过使用管道获取包含特定命令的作业

与上述示例中的命令相同,此命令获取系统中包括 Get-Process 命令的作业。 该命令使用管道运算符 (|) 将具有 NoteProperty Command 的 PSCustomObject 发送到 Get-Job cmdlet。 它等效于之前的命令。

[pscustomobject]@{Command='*Get-Process*'} | Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
3      Job3            BackgroundJob   Running       True            localhost            Get-Process

示例 5:获取尚未启动的作业

此命令只获取那些已创建的但尚未启动的作业。 这包括计划要在将来运行的作业和尚未计划的作业。

Get-Job -State NotStarted

示例 6:获取尚未分配名称的作业

此命令获取作业名称以“job”开头的所有作业。 由于“job<number>”是作业的默认名称,因此此命令将获取所有未显式分配名称的作业。

Get-Job -Name Job*

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Completed     True            localhost             $env:COMPUTERNAME

示例 7:使用作业对象在命令中表示作业

此示例演示如何使用 Get-Job 来获取作业对象,然后演示如何在命令中使用作业对象表示作业。

第一个命令使用 Start-Job cmdlet 来启动在本地计算机上运行 Get-Process 命令的后台作业。 该命令使用 Start-JobName 参数为作业分配友好名称。 第二个命令使用 Get-Job 来获取作业。 它使用 Get-JobName 参数来标识作业。 此命令将生成的作业对象保存在 $j 变量中。 第三个命令显示 $j 变量中的作业对象的值。 State 属性的值显示该作业已完成。 HasMoreData 属性的值显示尚未检索的作业中存在可检索的结果。 第四个命令使用 Receive-Job cmdlet 来获取作业的结果。 它使用 $j 变量中的作业对象来表示作业。 还可以使用管道运算符将作业对象发送到 Receive-Job

Start-Job -ScriptBlock {Get-Process} -Name MyJob
$j = Get-Job -Name MyJob
$j

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
6      MyJob           BackgroundJob   Completed     True            localhost            Get-Process

Receive-Job -Job $j

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    124       4    13572      12080    59            1140 audiodg
    783      16    11428      13636   100             548 CcmExec
     96       4     4252       3764    59            3856 ccmsetup
...

示例 8:获取所有作业,包括以其他方法启动的作业

此示例演示 Get-Job cmdlet 可以获取在当前会话中启动的所有作业,即使它们是通过使用不同的方法启动的也是如此。

第一个命令使用 Start-Job cmdlet 在本地计算机上启动作业。 第二个命令使用 Invoke-Command cmdlet 的 AsJob 参数在 S1 计算机上启动作业。 虽然作业中的命令在远程计算机上运行,但该作业对象是在本地计算机上创建的,所以应使用本地命令来管理该作业。 第三个命令使用 Invoke-Command cmdlet 在 S2 计算机上运行 Start-Job 命令。 使用此方法将在远程计算机上创建该作业对象,所以应使用远程命令来管理该作业。 第四个命令使用 Get-Job 来获取存储在本地计算机上的作业。 Windows PowerShell 3.0 中引入的作业的 PSJobTypeName 属性显示,使用 Start-Job cmdlet 启动的本地作业是后台作业,而使用 Invoke-Command cmdlet 在远程会话中启动的作业是远程作业。 第五、第六和第七个命令使用 New-PSSession cmdlet 创建连接到 S2 计算机的 PSSession,它使用 Invoke-Command 通过 PSSession 和 Session 参数在远程计算机上启动作业。 然后,它使用在 S2 计算机上使用 PSSession 的 Get-Job 命令获取作业。 示例输出显示了 Get-Job 命令的结果。 在 S2 计算机上,该作业看起来像是本地作业。 计算机名称为 localhost,并且作业类型为后台作业。 有关如何在远程计算机上运行后台作业的详细信息,请参阅 about_Remote_Jobs

Start-Job -ScriptBlock {Get-EventLog -LogName System}
Invoke-Command -ComputerName S1 -ScriptBlock {Get-EventLog -LogName System} -AsJob
Invoke-Command -ComputerName S2 -ScriptBlock {Start-Job -ScriptBlock {Get-EventLog -LogName System}}
Get-Job

Id     Name       PSJobTypeName   State         HasMoreData     Location        Command
--     ----       -------------   -----         -----------     --------        -------
1      Job1       BackgroundJob   Running       True            localhost       Get-EventLog System
2      Job2       RemoteJob       Running       True            S1              Get-EventLog System

$Session = New-PSSession -ComputerName S2
Invoke-Command -Session $Session -ScriptBlock {Start-Job -ScriptBlock {Get-EventLog -LogName System}}
Invoke-Command -Session $Session -ScriptBlock {Get-Job}

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                   PSComputerName
--     ----            -------------   -----         -----------     --------             -------                   --------------
1      Job1            BackgroundJob   Running       True            localhost            Get-EventLog -LogName Sy… S2

示例 9:调查失败的作业

此命令显示如何使用 Get-Job 返回的作业对象来调查作业失败的原因。 此命令还显示了如何获取每个作业的子作业。

第一个命令使用 Start-Job cmdlet 在本地计算机上启动作业。 Start-Job 返回的作业对象显示作业失败。 State 属性的值为 Failed。

第二个命令使用 Get-Job cmdlet 来获取该作业。 该命令使用点法获取对象的 JobStateInfo 属性的值。 它使用管道运算符将 JobStateInfo 属性中的对象发送到 Format-List cmdlet,后者为列表中的对象 (*) 的所有属性设置格式。Format-List 命令的结果显示作业的 Reason 属性的值为空。

第三个命令将作进一步调查。 它使用 Get-Job 命令获取作业,然后使用管道运算符将整个作业对象发送到 Format-List cmdlet,后者在列表中显示作业的所有属性。作业对象中所有属性的显示表明作业包含名为 Job2 的子作业。

第四个命令使用 Get-Job 获取表示 Job2 子作业的作业对象。 命令实际在该作业中运行。 它使用点值法获取 JobStateInfo 属性的 Reason 属性。结果显示作业因“访问被拒绝”错误而失败。 在这种情况下,用户忘记在启动 Windows PowerShell 时使用“以管理员身份运行”选项。因为后台作业使用 Windows PowerShell 的远程处理功能,因此必须将计算机配置为远程运行作业,即使作业在本地计算机上运行也是如此。有关 Windows PowerShell 中远程处理的要求的信息,请参阅 about_Remote_Requirements。 有关疑难解答提示,请参阅 about_Remote_Troubleshooting

PS> Start-Job -ScriptBlock {Get-Process}
Id     Name       PSJobTypeName   State       HasMoreData     Location             Command
--     ----       -------------   -----       -----------     --------             -------
1      Job1       BackgroundJob   Failed      False           localhost            Get-Process

PS> (Get-Job).JobStateInfo | Format-List -Property *
State  : Failed
Reason :

PS> Get-Job | Format-List -Property *
HasMoreData   : False
StatusMessage :
Location      : localhost
Command       : get-process
JobStateInfo  : Failed
Finished      : System.Threading.ManualReset
EventInstanceId    : fb792295-1318-4f5d-8ac8-8a89c5261507
Id            : 1
Name          : Job1
ChildJobs     : {Job2}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

PS> (Get-Job -Name job2).JobStateInfo.Reason
Connecting to remote server using WSManCreateShellEx api failed. The async callback gave the
following error message: Access is denied.

示例 10:获取筛选的结果

此示例显示如何使用 Filter 参数获取工作流作业。 在 Windows PowerShell 3.0 中引入的 Filter 参数仅在自定义作业类型(例如工作流作业和计划作业)上有效。

第一个命令使用 Workflow 关键字来创建 WFProcess 工作流。 第二个命令使用 WFProcess 工作流的 AsJob 参数将工作流作为后台作业运行。 该命令使用工作流的 JobName 参数为作业指定名称,并使用工作流的 PSPrivateMetadata 参数指定自定义 ID。 第三个命令使用 Get-JobFilter 参数,按照在 PSPrivateMetadata 参数中指定的自定义 ID 来获取作业。

PS> Workflow WFProcess {Get-Process}
PS> WFProcess -AsJob -JobName WFProcessJob -PSPrivateMetadata @{MyCustomId = 92107}
PS> Get-Job -Filter @{MyCustomId = 92107}
Id     Name            State         HasMoreData     Location             Command
--     ----            -----         -----------     --------             -------
1      WFProcessJob    Completed     True            localhost            WFProcess

示例 11:获取有关子作业的信息

此示例显示使用 Get-Job cmdlet 的 IncludeChildJobChildJobState 参数的效果。

第一个命令获取当前会话中的作业。 输出包括一个后台作业、一个远程作业和一个计划作业的几个实例。 远程作业 Job4 显示为已失败。 第二个命令使用 Get-JobIncludeChildJob 参数。 输出将添加具有子作业的所有作业的子作业。在这种情况下,修订后的输出显示只有 Job4 的 Job5 子作业失败。 第三个命令使用具有 Failed 值的 ChildJobState 参数。输出包含所有父作业以及失败的子作业。 第五个命令使用作业的 JobStateInfo 属性和该属性的 Reason 属性来查明 Job5 失败的原因。

PS> Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      Job2            BackgroundJob   Completed     True            localhost            .\Get-Archive.ps1
4      Job4            RemoteJob       Failed        True            Server01, Server02   .\Get-Archive.ps1
7      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
8      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
9      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
10     UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help

PS> Get-Job -IncludeChildJob

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      Job2            BackgroundJob   Completed     True            localhost           .\Get-Archive.ps1
3      Job3                            Completed     True            localhost           .\Get-Archive.ps1
4      Job4            RemoteJob       Failed        True            Server01, Server02  .\Get-Archive.ps1
5      Job5                            Failed        False           Server01            .\Get-Archive.ps1
6      Job6                            Completed     True            Server02            .\Get-Archive.ps1
7      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
8      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
9      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
10     UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help

PS> Get-Job -Name Job4 -ChildJobState Failed

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      Job2            BackgroundJob   Completed     True            localhost           .\Get-Archive.ps1
4      Job4            RemoteJob       Failed        True            Server01, Server02  .\Get-Archive.ps1
5      Job5                            Failed        False           Server01            .\Get-Archive.ps1
7      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
8      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
9      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
10     UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help

PS> (Get-Job -Name Job5).JobStateInfo.Reason

Connecting to remote server Server01 failed with the following error message:
Access is denied.

有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。

参数

-After

获取在指定日期和时间后结束完成的作业。 输入一个 DateTime 对象,例如 Get-Date cmdlet 返回的对象,或者输入一个可转换为 DateTime 对象的字符串,例如 Dec 1, 2012 2:00 AM11/06

此参数仅适用于具有 EndTime 属性的自定义作业类型(例如工作流作业和计划作业)。 它不适用于标准后台作业,例如那些通过使用 Start-Job cmdlet 创建的作业。 有关支持此参数的信息,请参阅作业类型的帮助主题。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:DateTime
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Before

获取在指定日期和时间前结束前完成的作业。 输入一个 DateTime 对象。

此参数仅适用于具有 EndTime 属性的自定义作业类型(例如工作流作业和计划作业)。 它不适用于标准后台作业,例如那些通过使用 Start-Job cmdlet 创建的作业。 有关支持此参数的信息,请参阅作业类型的帮助主题。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:DateTime
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ChildJobState

只获取具有指定状态的子作业。 此参数的可接受值为:

  • NotStarted
  • 正在运行
  • 已完成
  • 已失败
  • 已停止
  • 已阻止
  • Suspended
  • 已断开连接
  • 暂停中
  • 正在停止

默认情况下,Get-Job 不会获取子作业。 如果使用 IncludeChildJob 参数,则 Get-Job 将获取所有子作业。 如果使用 ChildJobState 参数,则 IncludeChildJob 参数将不起作用。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:JobState
Accepted values:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Command

以字符串形式指定一个命令数组。 此 cmdlet 获取包含指定命令的作业。 默认值为所有作业。 可以使用通配符来指定命令模式。

Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:True

-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

-HasMoreData

指示此 cmdlet 是否仅获取具有指定 HasMoreData 属性值的作业。 HasMoreData 属性指示当前会话中是否已接收所有作业结果。 若要获取具有更多结果的作业,请指定 $True 的值。 若要获取没有更多结果的作业,请指定 $False 的值。

若要获取作业的结果,请使用 Receive-Job cmdlet。

在使用 Receive-Job cmdlet 时,该 cmdlet 将从其内存中特定于会话的存储中删除它返回的结果。 返回当前会话中的作业的所有结果后,该 cmdlet 会将该作业的 HasMoreData 属性的值设置为 $False,以指示它不具有当前会话中的作业的更多对应结果。 使用 Receive-JobKeep 参数以防止 Receive-Job 删除结果和更改 HasMoreData 属性的值。 要了解详情,请键入 Get-Help Receive-Job

HasMoreData 属性特定于当前会话。 如果自定义作业类型的结果保存在会话外(例如计划作业类型,它将作业结果保存在磁盘上),则可以在其他会话中使用 Receive-Job cmdlet 来再次获取作业结果,即使 HasMoreData 的值为 $False 也是如此。 有关详细信息,请参阅自定义作业类型的帮助主题。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:Boolean
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:False
Accept pipeline input:True
Accept wildcard characters:False

-IncludeChildJob

指示除了父作业,此 cmdlet 还将返回子作业。

此参数对于调查工作流作业(Get-Job 将为其返回容器父作业)以及调查作业失败特别有用(因为失败的原因保存在子作业的属性中)。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
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

-Name

指定此 cmdlet 获取的作业的实例友好名称数组。 输入作业名称,或使用通配符输入作业名称模式。 默认情况下,Get-Job 获取当前会话中的所有作业。

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:True

-Newest

指定要获取的多个作业。 此 cmdlet 获取最近结束的作业。

Newest 参数不会按结束时间的顺序对输出进行排序或返回最新的作业。 若要对输出进行排序,请使用 Sort-Object cmdlet。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-State

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

  • NotStarted
  • 正在运行
  • 已完成
  • 已失败
  • 已停止
  • 已阻止
  • Suspended
  • 已断开连接
  • 暂停中
  • 正在停止

默认情况下,Get-Job 获取当前会话中的所有作业。

有关作业状态的详细信息,请参阅 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

输入

None

不能通过管道将对象传递给此 cmdlet。

输出

System.Management.Automation.RemotingJob

此 cmdlet 返回表示会话中的作业的对象。

备注

PowerShell 包含 Get-Job 的以下别名:

  • 所有平台:
    • gjb

作业的 PSJobTypeName 属性指示作业的作业类型。 该属性值由作业类型的作者确定。 以下列表显示了常见作业类型。

  • BackgroundJob。 通过使用 Start-Job 启动的本地作业。
  • RemoteJob。 通过使用 Invoke-Command cmdlet 的 AsJob 参数在 PSSession 中启动的作业。
  • PSWorkflowJob。 通过使用工作流的 AsJob 通用参数启动的作业。