关于作业详细信息
简短说明
提供有关本地和远程计算机上的后台作业的详细信息。
详细说明
本主题介绍后台作业的概念,并提供有关后台作业如何在 PowerShell 中工作的技术信息。
本主题是对 about_Jobs、 about_Thread_Jobs和 about_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-Command
的 AsJob 参数,或使用 Invoke-Command
cmdlet 远程运行Start-Job
命令。 还可以在交互式会话中启动后台作业。
有关远程后台作业的详细信息,请参阅 about_Remote_Jobs。
子作业
每个后台作业由一个父作业和一个或多个子作业组成。 在使用 或 的 AsJob 参数启动Start-Job
的Invoke-Command
作业中,父作业是主管。 它不运行任何命令或返回任何结果。 这些命令实际上由子作业运行。 开始使用其他 cmdlet 的作业可能以不同的方式工作。
子作业存储在父作业对象的 ChildJobs 属性中。 ChildJobs 属性可以包含一个或多个子作业对象。 子作业对象具有不同于父作业 的 Name、 ID 和 InstanceId ,因此你可以单独或作为一个单元管理父作业和子作业。
若要获取作业的父作业和子作业,请使用 cmdlet 的 Get-Job
IncludeChildJobs 参数。 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-Job
ChildJobState 参数。 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-Command
AsJob 参数在一台或多台计算机上启动作业时,该作业由一个执行父作业和一个子作业组成,适用于每台计算机上运行的每个作业。使用
Invoke-Command
在一Start-Job
台或多台远程计算机上运行命令时,结果与每台远程计算机上运行的本地命令相同。 命令返回每台计算机的作业对象。 作业对象由一个执行父作业和一个运行命令的子作业组成。
父作业表示所有子作业。 管理父作业时,还可以管理关联的子作业。 例如,如果停止父作业,则会停止所有子作业。 如果获取父作业的结果,则会获得所有子作业的结果。
但是,也可以单独管理子作业。 如果要调查作业的问题,或者仅获取使用 的 AsJob 参数 Invoke-Command
启动的多个子作业中的一个的结果,这非常有用。
以下命令使用 的 Invoke-Command
AsJob 参数在本地计算机和两台远程计算机上启动后台作业。 命令将作业保存在 变量中 $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-Job
和 Start-Job
。 其他 cmdlet 附带专用 cmdlet,这些 cmdlet 仅管理特定类型的作业。 有关自定义作业类型的详细信息,请参阅有关作业类型的帮助主题。
若要查找作业的作业类型,请使用 Get-Job
cmdlet。 Get-Job
为不同类型的作业返回不同的作业对象。 返回 的作业对象的 Get-Job
PSJobTypeName 属性的值指示作业类型。
下表列出了 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