关于作业详细信息

简短说明

提供有关本地和远程计算机上的后台作业的详细信息。

详细说明

本主题介绍后台作业的概念,并提供有关后台作业如何在 PowerShell 中工作的技术信息。

本主题是对 about_Jobsabout_Thread_Jobsabout_Remote_Jobs 主题的补充。

关于后台作业

后台作业异步运行命令或表达式。 它可以运行 cmdlet、函数、脚本或任何其他基于命令的任务。 它旨在运行需要较长时间的命令,但你可以使用它在后台运行任何命令。

当同步命令运行时,PowerShell 命令提示符将被禁止显示,直到该命令完成。 但后台作业不会禁止显示 PowerShell 提示符。 启动后台作业的命令返回作业对象。 提示会立即返回,以便在后台作业运行时处理其他任务。

但是,启动后台作业时,即使作业运行得非常快,也不会立即获得结果。 返回的作业对象包含有关作业的有用信息,但它不包含作业结果。 必须运行单独的命令才能获取作业结果。 还可以运行命令来停止作业、等待作业完成以及删除作业。

为了使后台作业的计时独立于其他命令,每个后台作业在其自己的 PowerShell 会话中运行。 但是,这可以是一个临时连接,它只是为了运行作业而创建,然后被销毁,也可以是可用于运行多个相关作业或命令的持久性 PSSession

使用作业 cmdlet

使用 Start-Job 命令在本地计算机上启动后台作业。 Start-Job 返回作业对象。 还可以使用 Get-Job cmdlet 获取表示在本地计算机上启动的作业的对象。

若要获取作业结果,请使用 Receive-Job 命令。 如果作业未完成, Receive-Job 则返回部分结果。 还可以使用 Wait-Job cmdlet 取消命令提示符,直到会话中启动的一个或所有作业完成。

若要停止后台作业,请使用 Stop-Job cmdlet。 若要删除作业,请使用 Remove-Job cmdlet。

有关 cmdlet 工作原理的详细信息,请参阅每个 cmdlet 的帮助主题和 about_Jobs

在远程计算机上启动后台作业

可以在本地或远程计算机上创建和管理后台作业。 若要远程运行后台作业,请使用 cmdlet(如 )Invoke-CommandAsJob 参数,或使用 Invoke-Command cmdlet 远程运行Start-Job命令。 还可以在交互式会话中启动后台作业。

有关远程后台作业的详细信息,请参阅 about_Remote_Jobs

子作业

每个后台作业由一个父作业和一个或多个子作业组成。 在使用 或 的 AsJob 参数启动Start-JobInvoke-Command作业中,父作业是主管。 它不运行任何命令或返回任何结果。 这些命令实际上由子作业运行。 开始使用其他 cmdlet 的作业可能以不同的方式工作。

子作业存储在父作业对象的 ChildJobs 属性中。 ChildJobs 属性可以包含一个或多个子作业对象。 子作业对象具有不同于父作业 的 NameIDInstanceId ,因此你可以单独或作为一个单元管理父作业和子作业。

若要获取作业的父作业和子作业,请使用 cmdlet 的 Get-JobIncludeChildJobs 参数。 IncludeChildJob 参数是在 Windows PowerShell 3.0 中引入的。

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

若要获取父作业和仅具有特定 State 值的子作业,请使用 cmdlet 的 Get-JobChildJobState 参数。 ChildJobState 参数是在 Windows PowerShell 3.0 中引入的。

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

若要在所有版本的 PowerShell 上获取作业的子作业,请使用父作业的 ChildJob 属性。

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

还可以对子作业使用 Get-Job 命令,如以下命令中所示:

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

子作业的配置取决于用于启动作业的命令。

  • 使用 Start-Job 在本地计算机上启动作业时,该作业由执行父作业和运行命令的子作业组成。

  • 使用 的 Invoke-CommandAsJob 参数在一台或多台计算机上启动作业时,该作业由一个执行父作业和一个子作业组成,适用于每台计算机上运行的每个作业。

  • 使用 Invoke-Command 在一 Start-Job 台或多台远程计算机上运行命令时,结果与每台远程计算机上运行的本地命令相同。 命令返回每台计算机的作业对象。 作业对象由一个执行父作业和一个运行命令的子作业组成。

父作业表示所有子作业。 管理父作业时,还可以管理关联的子作业。 例如,如果停止父作业,则会停止所有子作业。 如果获取父作业的结果,则会获得所有子作业的结果。

但是,也可以单独管理子作业。 如果要调查作业的问题,或者仅获取使用 的 AsJob 参数 Invoke-Command启动的多个子作业中的一个的结果,这非常有用。

以下命令使用 的 Invoke-CommandAsJob 参数在本地计算机和两台远程计算机上启动后台作业。 命令将作业保存在 变量中 $j

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

在 中$j显示作业的 Name 和 ChildJob 属性时,它显示命令返回了一个作业对象,其中包含三个子作业,每个计算机一个。

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

显示父作业时,它显示作业失败。

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

但是,运行 Get-Job 获取子作业的命令时,输出显示只有一个子作业失败。

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

若要获取所有子作业的结果,请使用 Receive-Job cmdlet 获取父作业的结果。 但也可以获取特定子作业的结果,如以下命令中所示。

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

PowerShell 后台作业的子作业功能使你能够更好地控制所运行的作业。

作业类型

PowerShell 支持不同任务的不同类型的作业。 从 Windows PowerShell 3.0 开始,开发人员可以编写“作业源适配器”,以将新的作业类型添加到 PowerShell 并在模块中包含作业源适配器。 导入模块时,可以在会话中使用新的作业类型。

例如,PSScheduledJob 模块添加计划作业,PSWorkflow 模块添加工作流作业。

自定义作业类型可能与标准 PowerShell 后台作业明显不同。 例如,计划作业保存在磁盘上;它们不只存在于特定会话中。 可以暂停和恢复工作流作业。

用于管理自定义作业的 cmdlet 取决于作业类型。 对于某些用户,请使用标准作业 cmdlet,例如 Get-JobStart-Job。 其他 cmdlet 附带专用 cmdlet,这些 cmdlet 仅管理特定类型的作业。 有关自定义作业类型的详细信息,请参阅有关作业类型的帮助主题。

若要查找作业的作业类型,请使用 Get-Job cmdlet。 Get-Job 为不同类型的作业返回不同的作业对象。 返回 的作业对象的 Get-JobPSJobTypeName 属性的值指示作业类型。

下表列出了 PowerShell 附带的作业类型。

作业类型 说明
BackgroundJob 开始使用 Start-Job cmdlet。
RemoteJob 已开始使用 的 AsJob 参数
Invoke-Command cmdlet。
PSWorkflowJob 开始使用工作流的 AsJob 参数。
PSScheduledJob 由作业触发器启动的计划作业的实例。
CIMJob 已从 使用 cmdlet 的 AsJob 参数开始
CDXML 模块。
WMIJob 已从 使用 cmdlet 的 AsJob 参数开始
WMI 模块。
PSEventJob 使用Register-ObjectEvent 并指定 创建
具有 Action 参数 的 action

注意:在使用 Get-Job cmdlet 获取特定类型的作业之前,请验证添加作业类型的模块是否已导入当前会话。 否则, Get-Job 不会获取该类型的作业。

示例

以下命令创建本地后台作业、远程后台作业、工作流作业和计划作业。 然后,它使用 Get-Job cmdlet 获取作业。 Get-Job 不会获取计划作业,但会获取计划作业的任何已启动实例。

在本地计算机上启动后台作业。

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

启动在远程计算机上运行的后台作业。

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

创建计划作业

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Create工作流。

PS> workflow Test-Workflow {Get-Process}

以作业的形式运行工作流。


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

获取作业。 命令 Get-Job 不会获取计划作业,但获取已启动的计划作业的实例。

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

若要获取计划的作业,请使用 Get-ScheduledJob cmdlet。

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

另请参阅