about_Jobs
適用於: Windows PowerShell 2.0, Windows PowerShell 3.0
主題
about_Jobs
簡短描述
提供 Windows PowerShell 背景工作如何在背景中執行命令或運算式而不需與目前工作階段互動的相關資訊。
詳細描述
本主題說明如何在本機電腦上使用 Windows PowerShell 執行背景工作。如需在遠端電腦上執行背景工作的相關資訊,請參閱 about_Remote_Jobs。
當您啟動背景工作時,即使工作需要延長時間才能完成,也會立即傳回命令提示字元。工作執行時,您可以在工作階段中繼續工作,而不需中斷。
JOB CMDLET
Start-Job
在本機電腦上啟動背景工作。
Get-Job
取得目前工作階段中已啟動的背景工作。
Receive-Job
取得背景工作的結果。
Stop-Job
停止背景工作。
Wait-Job
在一個或所有工作完成前抑制命令提示字元。
Remove-Job
刪除背景工作。
Invoke-Command
AsJob 參數可在遠端電腦上以背景工作執行任何命令。您也可以使用 Invoke-Command 遠端執行任何工作命令,包括 Start-Job 命令。
如何在本機電腦上啟動工作
若要在本機電腦上啟動背景工作,請使用 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 會傳回目前工作階段中已啟動的所有工作。
例如,下列命令會取得目前工作階段中的工作。
PS C:\>Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
您也可以將工作物件儲存在變數中,並用它來代表工作中更新的命令。下列命令會取得識別碼為 1 的工作,並將它儲存在 $job 變數中。
$job = Get-Job -Id 1
工作物件包含工作狀態,以表示工作是否已完成。完成的工作會有「完成」或「失敗」的狀態。工作也可能正在執行或被封鎖。
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob 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
結果會顯示在資料表中。工作狀態會顯示在 [狀態] 資料行中。
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log Syst...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Recurse
在此案例中,State 屬性顯示「工作 2」仍在執行。如果您要使用 Receive-Job Cmdlet 立即取得工作結果,則結果會不完整。您可以重複使用 Receive-Job Cmdlet 取得所有結果。預設為每次使用時僅會取得之前未收到的結果,但您可以使用 Receive-Job Cmdlet 的 Keep 參數來保留已經收到的結果。
您可以將部分結果寫入檔案中,並在收到新結果時附加進去,或者,您可以等候並稍後再確認工作狀態。
您可以使用 Receive-Job Cmdlet 的 Wait 參數,即可等到工作完成並已具備所有結果時才傳回命令提示字元。
您也可以使用 Wait-Job Cmdlet 以等候工作的任何或所有結果。Wait-Job 可讓您等候特定工作、所有工作或任何工作直到完成。
下列命令會使用 Wait-Job Cmdlet 來等待識別碼為 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 PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob 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.
另請參閱
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command