主题 about_Jobs 简短说明 提供有关 Windows PowerShell 后台作业如何在后台运行命令或表达式而不与当前会话交互的信息。 详细说明 本主题说明如何在本地计算机的 Windows PowerShell 中运行后台作业。有关在远程计算机上 运行后台作业的信息,请参阅 about_Remote_Jobs。 启动后台作业时,命令提示符会立即返回,即使该作业需要较长时间才能完成也是如此。 您可以在作业运行的同时继续在此会话中工作,而不会产生中断。 重要说明:通过使用 Start-Job 或使用 Invoke-Command 的 AsJob 参数启动的后台作业依赖于 Windows PowerShell 远程处理基础结构。若要使用这些功能,即使后台作业只在本地计算机上运行, 也必须为 Windows PowerShell 配置远程处理。有关详细信息,请参阅 about_Remote_Requirements。 如何在本地计算机上启动作业 若要在本地计算机上启动后台作业,请使用 Start-Job cmdlet。 若要编写 Start-Job 命令,请将作业运行的命令用大括号 ({}) 括起。请使用 ScriptBlock 参数来 指定命令。 下面的命令启动一个后台作业,该作业在本地计算机上运行 Get-Process 命令。 start-job -scriptblock {get-process} Start-Job 命令返回一个表示该作业的对象。作业对象包含作业的有用信息,但不包含作业结果。 将作业对象保存在变量中,然后将它用于其他作业 cmdlet 以管理该后台作业。下面的命令启动一个作业 对象,然后将生成的作业对象保存在 $job 变量中。 $job = start-job -scriptblock {get-process} 此外,还可以使用 Get-Job cmdlet 获取表示在当前会话中启动的作业的对象。Get-Job 返回的作业 对象与 Start-Job 返回的相同。 获取作业对象 若要获取表示在当前会话中启动的后台作业的对象,请使用 Get-Job cmdlet。如果没有参数,则 Get- Job 返回在当前会话中启动的所有作业。 例如,下面的命令获取当前会话中的作业。 get-job Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Running True localhost get-process 此外,还可以将作业对象保存在变量中,并在后面的命令中使用该变量表示相应作业。 下面的命令获取 ID 为 1 的作业并将其保存在变量 $job 中。 $job = get-job -id 1 作业对象包含指示作业是否已完成的作业状态。已完成的作业的状态为"Complete"或"Failed"。 作业也可能处于"Blocked"或"Running"状态。 get-job Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost get-process 获取作业的结果 运行后台作业时,不会立即显示结果。实际上,Start-Job cmdlet 返回表示作业的作业对象,但不包 含结果。若要获取后台作业的结果,请使用 Receive-Job cmdlet。 下面的命令使用 Receive-Job cmdlet 获取作业结果。它使用保存在 $job 变量中的作业对象来标识 作业。 receive-job -job $job Receive-Job cmdlet 返回作业结果。 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec 668 7 2672 6168 104 32.26 488 csrss ... 也可以将作业结果保存在变量中。下面的命令将 $job 变量中的作业的结果保存在 $results 变量 中。 $results = receive-job -job $job 此外,还可以通过使用重定向运算符 (>) 或 Out-File cmdlet 将作业结果保存在文件中。下面的命 令使用重定向运算符将作业结果保存在 Results.txt 文件的 $job 变量中。 receive-job -job $job > results.txt 获取和保留部分作业结果 Receive-Job cmdlet 返回后台作业的结果。如果作业完成,则 Receive-Job 返回作业的完整结 果。如果作业仍在运行,则 Receive-Job 获取到目前为止已生成的结果。再次运行 Receive-Job 命 令可以获取其余结果。 当 Receive-Job 返回结果时,默认情况下,它会删除存储作业结果的缓存中的结果。如果运行另一个 Receive-Job 命令,则只获取尚未收到的结果。 下面的命令说明在作业完成之前运行的 Receive-Job 命令的结果。 C:\PS> receive-job -job $job Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec C:\PS> receive-job -job $job Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 68 3 2632 664 29 0.36 1388 ccmsetup 749 22 21468 19940 203 122.13 3644 communicator 905 7 2980 2628 34 197.97 424 csrss 1121 25 28408 32940 174 430.14 3048 explorer 若要防止 Receive-Job 删除它所返回的作业结果,请使用 Keep 参数。这样,Receive-Job 将返回 此前生成的所有结果。 下面的命令说明对尚未完成的作业使用 Keep 参数的效果。 C:\PS> receive-job -job $job -keep Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec C:\PS> receive-job -job $job -keep Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec 68 3 2632 664 29 0.36 1388 ccmsetup 749 22 21468 19940 203 122.13 3644 communicator 905 7 2980 2628 34 197.97 424 csrss 1121 25 28408 32940 174 430.14 3048 explorer 等待结果 如果运行需要很长时间才能完成的命令,则可以使用作业对象的属性来确定作业何时完成。下面的命令使用 Get-Job 对象获取当前会话中的所有后台作业。 get-job 结果显示在一个表中。作业状态显示在 State 列中。 Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost get-process 2 Job2 Running True localhost get-eventlog -log syst... 3 Job3 Complete True localhost dir -path c:\* -recurse 在本例中,从 State 属性可以看出 Job 2 仍在运行。如果此时要使用 Receive-Job cmdlet 获取 作业结果,则结果将是不完整的。可以重复使用 Receive-Job cmdlet 以获取所有结果。默认情况下, 每次使用该 cmdlet 时,都只获取尚未收到的结果,不过,可以使用 Receive-Job cmdlet 的 Keep 参数来保留结果(即使已收到这些结果)。 此时,可以将结果写入文件,然后在新收到的结果到达时进行追加。也可以等待,稍后再检查作业的状态。 此外,还可以使用 Wait-Job cmdlet 等待作业的任意或所有结果。使用 Wait-Job 可以等待特定作 业、所有作业或任何要完成的作业。 下面的命令使用 Wait-Job cmdlet 等待 ID 为 10 的作业。 wait-job -ID 10 结果是,在作业完成之前,都禁止显示 Windows PowerShell 提示符。 等待时间也可以是预定的时间段。下面的命令使用 Timeout 参数将等待时间限制为 120 秒。超过该时 间时,命令提示符会返回,但作业继续在后台运行。 wait-job -ID 10 -timeout 120 停止作业 若要停止后台作业,请使用 Stop-Job cmdlet。下面的命令启动一个作业,以获取系统事件日志中的每 个条目。它将作业对象保存在 $job 变量中。 $job = start-job -scriptblock {get-eventlog -log system} 下面的命令停止该作业。它使用管道运算符 (|) 将 $job 变量中的作业发送到 Stop-Job。 $job | stop-job 删除作业 若要删除后台作业,请使用 Remove-Job cmdlet。下面的命令删除 $job 变量中的作业。 remove-job -job $job 调查失败的作业 若要查明作业失败的原因,请使用作业对象的 Reason 子属性。 下面的命令在未使用所需凭据的情况下启动作业。它将作业对象保存在 $job 变量中。 $job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany} Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Failed False localhost new-item -path HKLM:\S... 下面的命令使用 Reason 属性查找导致作业失败的错误。 $job.ChildJobs[0].JobStateInfo.Reason 在本例中,作业失败的原因是远程计算机需要显式凭据才能运行该命令。Reason 属性的值为: Connecting to remote server failed with the following error message : Access is denied. 作业 Cmdlet Start-Job 在本地计算机上启动后台作业。 Get-Job 获取在当前会话中启动的后台作业。 Receive-Job 获取后台作业的结果。 Stop-Job 停止后台作业。 Wait-Job 禁止显示命令提示符,直到一个或所有作业完成。 Remove-Job 删除后台作业。 Invoke-Command AsJob 参数在远程计算机上将任何命令都作为后台作业运行。此外,还可以使用 Invoke-Command 远程运行任何作业命令,包括 Start-Job 命令。 另请参阅 about_Remote_Jobs about_Job_Details about_Remote about_PSSessions Start-Job Get-Job Receive-Job Stop-Job Wait-Job Remove-Job Invoke-Command