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