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:获取当前会话中启动的所有后台作业
此命令获取当前会话中启动的所有后台作业。 它不包括在其他会话中创建的作业,即使作业在本地计算机上运行也是如此。
PS C:\> Get-Job
示例 2:使用实例 ID 停止作业
这些命令演示如何获取作业的实例 ID,然后使用它停止作业。 与不唯一的作业名称不同,实例 ID 是唯一的。
第一个命令使用 Get-Job
cmdlet 来获取作业。 它使用 Name 参数来标识作业。 该命令存储 Get-Job
在 $j
变量中返回的作业对象。 在此示例中,只有一个具有指定名称的作业。 第二个命令获取 $j
变量中对象的 InstanceId 属性,并将其存储在 $ID
变量中。 第三个命令显示 $ID
变量的值。 第四个命令使用 Stop-Job
cmdlet 来停止作业。
它使用 InstanceId 参数来标识作业,并 $ID
变量来表示作业的实例 ID。
PS C:\> $j = Get-Job -Name Job1
PS C:\> $ID = $j.InstanceID
PS C:\> $ID
Guid
----
03c3232e-1d23-453b-a6f4-ed73c9e29d55
PS C:\> Stop-Job -InstanceId $ID
示例 3:获取包含特定命令的作业
此命令获取系统上包含 Get-Process
命令的作业。 该命令使用 Get-Job
的 Command 参数来限制检索的作业。 该命令使用通配符(*
)获取在命令字符串中的任何位置包含 Get-Process
命令的作业。
PS C:\> Get-Job -Command "*get-process*"
示例 4:使用管道获取包含特定命令的作业
与上一示例中的命令一样,此命令获取系统上包含 Get-Process
命令的作业。 该命令使用管道运算符(|
)将字符串(用引号)发送到 Get-Job
cmdlet。 它等效于上一个命令。
PS C:\> "*get-process*" | Get-Job
示例 5:获取尚未启动的作业
此命令仅获取已创建但尚未启动的作业。 这包括计划将来运行的作业,以及尚未计划的作业。
PS C:\> Get-Job -State NotStarted
示例 6:获取尚未分配名称的作业
此命令获取具有以作业开头的作业名称的所有作业。 由于 job<number>
是作业的默认名称,因此此命令将获取没有显式分配名称的所有作业。
PS C:\> Get-Job -Name Job*
示例 7:使用作业对象在命令中表示作业
此示例演示如何使用 Get-Job
获取作业对象,然后演示如何使用作业对象在命令中表示作业。
第一个命令使用 Start-Job
cmdlet 启动在本地计算机上运行 Get-Process
命令的后台作业。 该命令使用 Start-Job
的 Name 参数为作业分配友好名称。 第二个命令使用 Get-Job
来获取作业。 它使用 Get-Job
的 Name 参数来标识作业。 该命令将生成的作业对象保存在 $j
变量中。 第三个命令显示 $j
变量中作业对象的值。
State 属性的值显示作业已完成。
HasMoreData 属性的值显示,作业中已有尚未检索的结果。 第四个命令使用 Receive-Job
cmdlet 来获取作业的结果。 它使用 $j
变量中的作业对象来表示作业。 还可以使用管道运算符将作业对象发送到 Receive-Job
。
PS C:\> Start-Job -ScriptBlock {Get-Process} -Name MyJob
PS C:\> $j = Get-Job -Name MyJob
PS C:\> $j
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
6 MyJob BackgroundJob Completed True localhost Get-Process
PS C:\> 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 在远程会话中启动的作业是远程作业。 第五个命令使用 Invoke-Command
在 S2 计算机上运行 Get-Job
命令。示例输出显示 Get-Job
命令的结果。 在 S2 计算机上,作业显示为本地作业。 计算机名称为 localhost,作业类型为后台作业。有关如何在远程计算机上运行后台作业的详细信息,请参阅 about_Remote_Jobs。
PS C:\> Start-Job -ScriptBlock {Get-EventLog System}
PS C:\> Invoke-Command -ComputerName S1 -ScriptBlock {Get-EventLog System} -AsJob
PS C:\> Invoke-Command -ComputerName S2 -ScriptBlock {Start-Job -ScriptBlock {Get-EventLog System}}
PS C:\> 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
PS C:\> Invoke-Command -ComputerName S2 -ScriptBlock {Start-Job -ScriptBlock {Get-EventLog System}}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- ------- -------
4 Job4 BackgroundJob Running True localhost Get-Eventlog System
示例 9:调查失败的作业
此命令演示如何使用 Get-Job
返回的作业对象来调查作业失败的原因。
它还演示如何获取每个作业的子作业。
第一个命令使用 Start-Job
cmdlet 在本地计算机上启动作业。
Start-Job
返回的作业对象显示作业失败。
State 属性的值为 Failed。
第二个命令使用 Get-Job
cmdlet 来获取作业。 该命令使用 dot 方法获取对象的 JobStateInfo 属性的值。 它使用管道运算符将 JobStateInfo 属性中的对象发送到 Format-List
cmdlet,该 cmdlet 设置列表中对象(*
)的所有属性的格式。Format-List
命令的结果显示作业的 Reason 属性的值为空。
第三个命令将调查更多内容。 它使用 Get-Job
命令获取作业,然后使用管道运算符将整个作业对象发送到 Format-List
cmdlet,该 cmdlet 在列表中显示作业的所有属性。作业对象中所有属性的显示显示显示显示作业包含名为 Job2 的子作业。
第四个命令使用 Get-Job
获取表示 Job2 子作业的作业对象。 这是运行命令的作业。 它使用 dot 方法获取 JobStateInfo 属性的 Reason 属性。结果显示作业因访问被拒绝错误而失败。 在这种情况下,用户忘记在启动 Windows PowerShell 时使用“以管理员身份运行”选项。因为后台作业使用 Windows PowerShell 的远程处理功能,因此必须将计算机配置为远程处理以运行作业,即使作业在本地计算机上运行也是如此。有关 Windows PowerShell 中远程处理的要求的信息,请参阅 about_Remote_Requirements。 有关故障排除提示,请参阅 about_Remote_Troubleshooting。
PS C:\> Start-Job -ScriptBlock {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost Get-Process
PS C:\> (Get-Job).JobStateInfo | Format-List -Property *
State : Failed
Reason :
PS C:\> 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 C:\> (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-Job
的 Filter 参数按 PSPrivateMetadata 参数中指定的自定义 ID 获取作业。
PS C:\> Workflow WFProcess {Get-Process}
PS C:\> WFProcess -AsJob -JobName WFProcessJob -PSPrivateMetadata @{MyCustomId = 92107}
PS C:\> Get-Job -Filter @{MyCustomId = 92107}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 WFProcessJob Completed True localhost WFProcess
示例 11:获取有关子作业的信息
此示例显示了使用 Get-Job
cmdlet 的 IncludeChildJob 和 ChildJobState 参数的效果。
第一个命令获取当前会话中的作业。 输出包括后台作业、远程作业和计划的作业的多个实例。 远程作业 Job4 似乎失败。
第二个命令使用 Get-Job
的 IncludeChildJob 参数。 输出将添加具有子作业的所有作业的子作业。在这种情况下,修订后的输出显示只有 Job4 的 Job5 子作业失败。 第三个命令使用具有 Failed 值的 ChildJobState 参数。输出包含所有父作业,并且仅包含失败的子作业。 第五个命令使用作业的 JobStateInfo 属性及其 Reason 属性来发现 Job5 失败的原因。
PS C:\> 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 C:\> 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 C:\> 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 C:\> (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 AM
或 11/06
。
此参数仅适用于具有 EndTime 属性的自定义作业类型,例如工作流作业和计划作业。 它不适用于标准后台作业,例如使用 Start-Job
cmdlet 创建的作业。 有关此参数支持的信息,请参阅作业类型的帮助主题。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | DateTime |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Before
获取在指定日期和时间之前结束的已完成作业。 输入 DateTime 对象。
此参数仅适用于具有 EndTime 属性的自定义作业类型,例如工作流作业和计划作业。 它不适用于标准后台作业,例如使用 Start-Job
cmdlet 创建的作业。 有关此参数支持的信息,请参阅作业类型的帮助主题。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | DateTime |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ChildJobState
仅获取具有指定状态的子作业。 此参数的可接受值为:
- NotStarted
- 运行
- 完成
- 失败
- 停止
- 封锁
- 暂停
- 断开
- 暂停
- 停止
默认情况下,Get-Job
不会获取子作业。 通过使用 IncludeChildJob 参数,Get-Job
获取所有子作业。 如果使用 ChildJobState 参数,则 IncludeChildJob 参数不起作用。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | JobState |
接受的值: | NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Command
将命令数组指定为字符串。 此 cmdlet 获取包含指定命令的作业。 默认值为所有作业。 可以使用通配符来指定命令模式。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | True |
接受通配符: | True |
-Filter
指定条件的哈希表。 此 cmdlet 获取满足所有条件的作业。 输入一个哈希表,其中键是作业属性,值是作业属性值。
此参数仅适用于自定义作业类型,例如工作流作业和计划作业。 它不适用于标准后台作业,例如使用 Start-Job
cmdlet 创建的作业。 有关此参数支持的信息,请参阅作业类型的帮助主题。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | Hashtable |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-HasMoreData
指示此 cmdlet 是否仅获取具有指定 HasMoreData 属性值的作业。
HasMoreData 属性指示是否已在当前会话中收到所有作业结果。 若要获取具有更多结果的作业,请指定一个值 $True
。 若要获取没有更多结果的作业,请指定一个值 $False
。
若要获取作业的结果,请使用 Receive-Job
cmdlet。
使用 Receive-Job
cmdlet 时,它会从其内存中特定于会话的存储中删除它返回的结果。 当作业在当前会话中返回作业的所有结果时,它将作业的 HasMoreData 属性的值设置为 $False
),以指示该作业在当前会话中没有更多结果。 使用 Keep 参数 Receive-Job
以防止 Receive-Job
删除结果并更改 HasMoreData 属性的值。
有关详细信息,请键入 Get-Help Receive-Job
。
HasMoreData 属性特定于当前会话。 如果自定义作业类型的结果保存在会话之外,例如计划作业类型(将作业结果保存在磁盘上),则可以在另一个会话中使用 Receive-Job
cmdlet 再次获取作业结果,即使 HasMoreData 的值 $False
也是如此。 有关详细信息,请参阅自定义作业类型的帮助主题。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | Boolean |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Id
指定此 cmdlet 获取的作业 ID 数组。
ID 是一个整数,用于唯一标识当前会话中的作业。 记住和键入比实例 ID 更容易,但它仅在当前会话中是唯一的。 可以键入一个或多个用逗号分隔的 ID。 若要查找作业的 ID,请键入不带参数 Get-Job
。
类型: | Int32[] |
Position: | 0 |
默认值: | None |
必需: | False |
接受管道输入: | True |
接受通配符: | False |
-IncludeChildJob
指示此 cmdlet 除了返回父作业外,还会返回子作业。
此参数特别适用于调查工作流作业,其中 Get-Job
返回容器父作业和作业失败,因为失败的原因保存在子作业的属性中。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-InstanceId
指定此 cmdlet 获取的作业实例 ID 的数组。 默认值为所有作业。
实例 ID 是一个 GUID,用于唯一标识计算机上的作业。 若要查找作业的实例 ID,请使用 Get-Job
。
类型: | Guid[] |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-Name
指定此 cmdlet 获取的作业实例友好名称数组。 输入作业名称,或使用通配符输入作业名称模式。 默认情况下,Get-Job
获取当前会话中的所有作业。
类型: | String[] |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | True |
-Newest
指定要获取的多个作业。 此 cmdlet 获取最近结束的作业。
最新 参数不按结束时间顺序对最新作业进行排序或返回。 若要对输出进行排序,请使用 Sort-Object
cmdlet。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | Int32 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-State
指定作业状态。 此 cmdlet 仅获取处于指定状态的作业。 此参数的可接受值为:
- NotStarted
- 运行
- 完成
- 失败
- 停止
- 封锁
- 暂停
- 断开
- 暂停
- 停止
默认情况下,Get-Job
获取当前会话中的所有作业。
有关作业状态的详细信息,请参阅 JobState 枚举。
类型: | JobState |
接受的值: | NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
输入
None
不能通过管道将输入传递给此 cmdlet。
输出
System.Management.Automation.RemotingJob
此 cmdlet 返回表示会话中作业的对象。
备注
作业 PSJobTypeName 属性指示作业的作业类型。 属性值由作业类型作者确定。 以下列表显示了常见作业类型。
-
BackgroundJob。 使用
Start-Job
启动的本地作业。 -
RemoteJob。 作业通过使用
Invoke-Command
cmdlet 的 AsJob 参数在 PSSession 中启动。 - PSWorkflowJob。 作业使用 AsJob 工作流的常见参数启动。