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 命令會傳回代表該工作的物件。工作物件包含有用的工作資訊,但不包含工
作結果。
將工作物件儲存在變數中,然後用來搭配其他 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"
狀態。此外,工作也可能遭到封鎖或正在執行。
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,將工作的結果儲存在檔案中。
下列命令使用
重新導向運算子,將 $job 變數中工作的結果儲存在 Results.txt 檔案中。
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
------- ------ ----- ----- ----- ------ -- -----------
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 來取得所有結果。
根據預設,每次使用只會取得尚未接收的結果,但是您可以使用 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 屬性的
值是:
連線到遠端伺服器失敗,傳回下列錯誤訊息: 拒絕存取。
JOB 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