获取在当前会话中运行的 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

默认值

All jobs

是否接受管道输入?

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 所返回对象的类型。

输入

None

不能通过管道将输入传递给此 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。






另请参阅




目录