about_Job_Details
主题
about_Job_Details
简短说明
提供有关本地和远程计算机上的后台作业的详细信息。
详细说明
本主题说明后台作业的概念,并提供有关后台作业如何在 Windows PowerShell 中工作的技术信息。
本主题是对 about_Jobs 和 about_Remote_Jobs 主题的补充。
重要说明:通过使用 Start-Job 或使用 Invoke-Command 的 AsJob 参数启动的后台作业依赖于
Windows PowerShell 远程处理基础结构。若要使用这些功能,即使后台作业只在本地
计算机上运行,也必须为 Windows PowerShell 配置远程处理。有关详细信息,请参阅
about_Remote_Requirements。
关于后台作业
后台作业异步运行命令或表达式。它可运行 cmdlet、函数、脚本或任何其他基于命令的任务。它用于运
行需要较长时间的命令,不过,您可以使用它在后台运行任何命令。
在运行同步命令时,在命令完成之前,都禁止显示 Windows PowerShell 命令提示符。但后台作业不禁
止显示 Windows PowerShell 提示符。用于启动后台作业的命令会返回一个作业对象。提示符会立即返
回,这样,在后台作业运行时可以处理其他任务。
但是,启动后台作业后,即使该作业运行速度很快,也不会立即获得结果。返回的作业对象包含作业的
有用信息,但不包含作业结果。必须运行一个单独的命令才能获得作业结果。此外,还可以运行用于
停止作业、等待作业完成以及删除作业的命令。
若要使后台作业的计时独立于其他命令,每个后台作业都应在自己的 Windows 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。
子作业
每个后台作业由一个父作业和一个或多个子作业组成。在通过使用 Start-Job 或 Invoke-Command
的 AsJob 参数启动的作业中,父作业是管理性作业。它不运行任何命令,也不返回任何结果。命令实际
上是由子作业运行的。(通过其他 cmdlet 启动的作业的工作方式可能有所不同。)
子作业存储在父作业对象的 ChildJobs 属性中。ChildJobs 属性可包含一个或多个子作业对象。子作
业对象的名称、ID 和实例 ID 不同于父作业,因此,可以分别管理父作业和子作业,也可以将它们作为一
个整体进行管理。
若要查看作业中的父作业和子作业,请使用 Get-Job cmdlet 获取父作业,然后通过管道将父作业传递
给用于显示对象的 Name 和 ChildJobs 属性的 Format-List 命令,如以下命令所示。
C:\PS> get-job | format-list -property Name, ChildJobs
Name : Job1
ChildJobs : {Job2}
也可以对子作业使用 Get-Job 命令,如以下命令所示:
C:\PS> get-job job2
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
2 Job2 Completed True localhost get-process
子作业的配置取决于启动该作业时所用的命令。
-- 使用 Start-Job 在本地计算机上启动作业时,该作业由管理性父作业和运行命令的
子作业组成。
-- 如果使用 Invoke-Command 的 AsJob 参数在一台或多台计算机上启动作业,则作业由管理性
父作业和子作业(每台计算机上运行的每个作业对应于一个子作业)组成。
-- 如果使用 Invoke-Command 在一台或多台远程计算机上运行 Start-Job 命令,则结果与在每
台远程计算机上运行本地命令的结果相同。该命令为每台计算机返回一个作业对象。作业对象由管理
性父作业和一个运行命令的子作业组成。
父作业表示所有子作业。在管理父作业时,同时也在管理关联的子作业。例如,如果停止父作业,
则会停止所有子作业。如果获取父作业的结果,则会获取所有子作业的结果。
不过,也可以单独管理子作业。如果希望调查作业问题,或者只获取通过 Invoke-Command 的 AsJob
参数启动的诸多子作业中的一个子作业的结果,这非常有用。(倒引号 [`] 是继续符。)
以下命令使用 Invoke-Command 的 AsJob 参数在本地计算机和两台远程计算机上启动后台作业。此命
令将作业保存在 $j 变量中。
C:\PS> $j = invoke-command -computername localhost, Server01, Server02 `
-command {get-date} -AsJob
在显示 $j 中的作业的 Name 和 ChildJob 属性时,结果显示该命令返回了一个作业对象,其中有三个
子作业(每台计算机一个子作业)。
C:\PS> $j | format-list name, childjobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
在显示父作业时,结果显示该作业失败。
C:\PS> $j
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job3 Failed True localhost,server... get-date
但是,对每个子作业运行 Get-Job 命令时,结果显示只有一个子作业失败。
PS C:\ps-test> get-job job4, job5, job6
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
4 Job4 Completed True localhost get-date
5 Job5 Failed False Server01 get-date
6 Job6 Completed True Server02 get-date
若要获取所有子作业的结果,请使用 Receive-Job cmdlet 获取父作业的结果。不过,也可以获取特定
子作业的结果,如以下命令所示。
C:\PS> receive-job -job6 -keep | format-table ComputerName, DateTime -auto
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
使用 Windows PowerShell 后台作业的子作业功能,可以在更大程度上控制运行的作业。
另请参阅
about_Jobs
about_Remote_Jobs
about_Remote
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
New-PSSession
Enter-PSSession
Exit-PSSession