主题 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