Get-Job
获取在当前会话中运行的 Windows PowerShell 后台作业。
语法
Get-Job [-Command <string[]>] [<CommonParameters>]
Get-Job [[-InstanceId] <Guid[]>] [<CommonParameters>]
Get-Job [[-Name] <string[]>] [<CommonParameters>]
Get-Job [[-Id] <Int32[]>] [<CommonParameters>]
Get-Job [-State {<NotStarted> | <Running> | <Completed> | <Failed> | <Stopped> | <Blocked>}] [<CommonParameters>]
说明
Get-Job cmdlet 获取表示在当前会话中启动的后台作业的对象。可以使用 Get-Job 来获取通过 Start-Job 或任何 cmdlet 的 AsJob 参数启动的作业。
如果不使用参数,“Get-Job”命令会获取当前会话中所有的作业。可以使用 Get-Job 的参数来获取特定作业。
Get-Job 返回的作业对象包含作业的有用信息,但不包含作业结果。要获取作业结果,请使用 Receive-Job cmdlet。
Windows PowerShell 后台作业是“在后台”运行而不与当前会话交互的命令。通常,应使用后台作业来运行需要长时间才能完成的复杂命令。有关 Windows PowerShell 中的后台作业的详细信息,请参阅 about_Jobs。
参数
-Command <string[]>
获取包含指定命令的作业。默认值为所有作业。输入命令(以字符串的形式)。可以使用通配符来指定命令模式。
是否为必需? |
false |
位置? |
named |
默认值 |
所有作业 |
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
true |
-Id <Int32[]>
只获取具有指定 ID 的作业。
ID 是一个整数,用于在当前会话中唯一标识作业。它比实例 ID 更便于记忆和键入,但它只在当前会话中是唯一的。可以键入一个或多个 ID(以逗号分隔)。要查找作业的 ID,请键入不带参数的“Get-Job”。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-InstanceId <Guid[]>
获取具有指定实例 ID 的作业。默认值为所有作业。
实例 ID 是一个 GUID,用于在计算机上唯一地标识作业。若要查找作业的实例 ID,请使用 Get-Job。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
true |
-Name <string[]>
获取具有指定友好名称的作业。输入作业名称,或使用通配符输入作业名称模式。默认情况下,Get-Job 获取当前会话中的所有作业。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
true |
-State <JobState>
只获取处于指定状态的作业。有效值是 NotStarted、Running、Completed、Stopped、Failed 和 Blocked。默认情况下,Get-Job 获取当前会话中的所有作业。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
无 不能通过管道将输入传递给此 cmdlet。 |
输出 |
System.Management.Automation.RemotingJob Get-Job 返回表示会话中的作业的对象。 |
示例 1
C:\PS>get-job
说明
-----------
此命令获取在当前会话中启动的所有后台作业。其中不包括在其他会话中创建的作业,即使这些作业在本地计算机上运行也是如此。
示例 2
C:\PS>$j = get-job -name Job1
C:\PS> $ID = $j.InstanceID
C:\PS> $ID
Guid
----
03c3232e-1d23-453b-a6f4-ed73c9e29d55
C:\PS> stop-job -instanceid $ID
说明
-----------
这些命令说明如何获取作业的实例 ID,然后用它来停止作业。不同于作业名称的不唯一性,实例 ID 是唯一的。
第一条命令使用 Get-Job cmdlet 来获取一个作业。它使用 Name 参数来标识该作业。该命令将 Get-Job 返回的作业对象存储在 $j 变量中。在此示例中,只有一个具有指定名称的作业。
第二条命令获取 $j 变量中对象的 InstanceId 属性并将它存储在 $ID 变量中。
第三条命令显示 $ID 变量的值。
第四条命令使用 Stop-Job cmdlet 来停止作业。它使用 InstanceId 参数来标识作业,使用 $ID 变量来表示作业的实例 ID。
示例 3
C:\PS>get-job -command "*get-process*"
说明
-----------
此命令获取系统中包含 Get-Process 命令的作业。它使用 Get-Job 的 Command 参数来限制检索的作业。此命令使用通配符 (*) 来获取在命令字符串中的任意位置包含 Get-Process 命令的作业。
示例 4
C:\PS>"*get-process*" | get-job
说明
-----------
与上一示例中的命令一样,此命令获取系统中包含 Get-Process 命令的作业。该命令使用管道运算符 (|) 将双引号内的字符串发送给 Get-Job cmdlet。它与先前的命令等效。
示例 5
C:\PS>get-job -state NotStarted
说明
-----------
此命令只获取那些已创建、但尚未启动的作业。这包括计划在以后运行或尚未计划运行的作业。
示例 6
C:\PS>get-job -name job*
说明
-----------
此命令获取作业名称以“job”开头的所有作业。因为“job<number>”是作业的默认名称,所以此命令会获取所有没有被明确赋予名称的作业。
示例 7
C:\PS>start-job -scriptblock {get-process} -name MyJob
C:\PS> $j = get-job -name MyJob
C:\PS> $j
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 myjob Completed True localhost get-process
C:\PS> 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
...
说明
-----------
此示例说明如何使用 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。
示例 8
C:\PS>start-job -scriptblock {get-eventlog system}
C:\PS> invoke-command -computername S1 -scriptblock {get-eventlog system} -AsJob
C:\PS> invoke-command -computername S2 -scriptblock {start-job -scriptblock {get-eventlog system}}
C:\PS> get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost get-eventlog system
2 Job2 Running True S1 get-eventlog system
C:\PS> invoke-command -computername S2 -scriptblock {get-job}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
4 Job4 Running True localhost get-eventlog system
说明
-----------
此示例演示 Get-Job cmdlet 可以获取在当前会话中启动的所有作业,即使这些作业是使用不同的方法启动的也是如此。
第一条命令使用 Start-Job cmdlet 在本地计算机上启动作业。
第二条命令使用 Invoke-Command 的 AsJob 参数在 S1 计算机上启动作业。即使作业中的命令运行在远程计算机上,也会在本地计算机上创建作业对象,因此可以使用本地命令来管理作业。
第三条命令使用 Invoke-Command cmdlet 在 S2 计算机上运行 Start-Job 命令。使用此方法,作业对象在远程计算机上创建,因此可使用远程命令来管理作业。
第四条命令使用 Get-Job 来获取存储在本地计算机上的作业。
第五条命令使用 Invoke-Command 在 S2 计算机上运行 Get-Job 命令。
示例输出显示 Get-Job 命令的结果。
有关在远程计算机上运行后台作业的详细信息,请参阅 about_Remote_Jobs。
示例 9
C:\PS>start-job -scriptblock {get-process}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost get-process
C:\PS> (get-job).jobstateinfo | format-list -property *
State : Failed
Reason :
C:\PS> get-job | format-list *
HasMoreData : False
StatusMessage :
Location : localhost
Command : get-process
JobStateInfo : Failed
Finished : System.Threading.ManualResetEvent
InstanceId : fb792295-1318-4f5d-8ac8-8a89c5261507
Id : 1
Name : Job1
ChildJobs : {Job2}
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
StateChanged :
C:\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.
说明
-----------
此命令说明如何使用 Get-Job 返回的作业对象调查作业失败的原因。它还说明了如何获取每个作业的子作业。
第一条命令使用 Start-Job cmdlet 在本地计算机上启动作业。Start-Job 返回的作业对象显示作业失败。State 属性的值为“Failed”。
第二条命令使用 Get-Job 来获取作业对象。该命令使用点表示法来获取对象的 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。
另请参阅
概念
about_Jobs
about_Job_Details
about_Remote_Jobs
Start-Job
Receive-Job
Wait-Job
Stop-Job
Remove-Job
Invoke-Command