關於工作
簡短描述
提供 PowerShell 背景工作如何在背景中執行命令或表示式,而不需與目前的會話互動的相關信息。
詳細描述
本主題說明如何在本機電腦上的PowerShell中執行背景工作。 如需在遠端電腦上執行背景工作的相關信息,請參閱 about_Remote_Jobs。
當您啟動背景作業時,即使作業需要較長的時間才能完成,命令提示字元仍會立即傳回。 工作執行時,您可以在工作階段中繼續工作,而不需中斷。
作業 CMDLET
Cmdlet | Description |
---|---|
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 ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
在此情況下,State 屬性會顯示 Job 2 仍在執行中。 如果您現在使用 Receive-Job
Cmdlet 來取得作業結果,結果將會不完整。 您可以重複使用 Receive-Job
Cmdlet 來取得所有結果。 根據預設,每次使用時,您只會取得尚未收到的結果,但您可以使用 Receive-Job Cmdlet 的 Keep 參數來保留結果,即使已收到結果也一樣。
您可以將部分結果寫入檔案,然後在結果送達時附加較新的結果,或者稍後可以等候並檢查作業的狀態。
您可以使用 Cmdlet 的 Receive-Job
Wait 參數,在作業完成且所有結果都可用之前,不會傳回命令提示字元。
您也可以使用 Wait-Job
Cmdlet 來等候作業的任何或所有結果。 Wait-Job
可讓您等候特定作業、所有作業,或等候任何作業完成。
下列命令會使用 Wait-Job Cmdlet 來等候標識碼為 10 的作業。
Wait-Job -ID 10
因此,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:...
下列命令會使用 Reason 屬性來尋找導致作業失敗的錯誤。
$job.ChildJobs[0].JobStateInfo.Reason
在此情況下,作業失敗,因為遠端計算機需要明確的認證才能執行命令。 Reason 屬性的值是:
連線到遠端伺服器失敗,並出現下列錯誤訊息:拒絕存取。