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