共用方式為


關於工作

簡短描述

提供 PowerShell 背景工作如何在背景中執行命令或運算式的相關資訊,而不需與目前的會話互動。

詳細描述

本主題說明如何在本機電腦上的 PowerShell 中執行背景工作。 如需在遠端電腦上執行背景工作的相關資訊,請參閱about_Remote_Jobs

當您啟動背景工作時,命令提示字元會立即傳回,即使作業需要很長的時間才能完成。 工作執行時,您可以在工作階段中繼續工作,而不需中斷。

作業 CMDLET

Cmdlet 描述
Start-Job 在本機電腦上啟動背景工作。
Get-Job 取得在中啟動的背景工作。
目前的會話。
Receive-Job 取得背景工作的結果。
Stop-Job 停止背景工作。
Wait-Job 抑制命令提示字元,直到一個或所有作業都是
套.
Remove-Job 移除背景工作。
Invoke-Command AsJob 參數會以背景的形式執行任何命令
遠端電腦上的作業。 您也可以使用沒有參數的
Invoke-Command若要從遠端執行任何作業命令,
包含啟動作業命令。

如何在本機電腦上啟動工作

若要在本機電腦上啟動背景工作,請使用 [啟動作業] Cmdlet。

若要寫入啟動作業命令,請以大括弧({})括住作業執行的命令。 使用 ScriptBlock 參數指定命令。

下列命令會啟動在 Get-Process 本機電腦上執行命令的背景工作。

Start-Job -ScriptBlock {Get-Process}

Start-Job 命令會傳回代表工作的物件。 工作物件包含工作的相關實用資訊,但是不包含工作結果。

將工作物件儲存在變數中,然後將它與其他作業 Cmdlet 搭配使用,以管理背景工作。 下列命令會啟動工作物件,並將產生的工作物件儲存在 $ 工作變數中。

$job = Start-Job -ScriptBlock {Get-Process}

您也可以使用 Get-Job Cmdlet 來取得代表在目前會話中啟動之作業的物件。 Get-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 = Get-Job -Id 1

工作物件包含工作的狀態,指出作業是否已完成。 完成的工作狀態為「完成」或「失敗」。 作業可能也會遭到封鎖或執行。

Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

取得作業的結果

當您執行背景工作時,結果不會立即出現。 相反地,啟動作業 Cmdlet 會傳回代表作業的工作物件,但不包含結果。 若要取得背景工作的結果,請使用 Receive-Job Cmdlet。

下列命令會使用 Receive-Job Cmdlet 來取得作業的結果。 它會使用儲存在工作變數中的工作物件 $ 來識別作業。

Receive-Job -Job $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
# ...

您也可以將工作的結果儲存在變數中。 下列命令會將工作的結果儲存在 [ $ $ 結果] 變數中。

$results = Receive-Job -Job $job

而且,您可以使用重新導向運算子(>)或 Out-File Cmdlet,將作業的結果儲存在檔案中。 下列命令會使用重新導向運算子,將作業的結果儲存在 Results.txt 檔案的 $ 工作變數中。

Receive-Job -Job $job > results.txt

取得和保留部分作業結果

接收-Job Cmdlet 會取得背景作業的結果。 如果作業已完成,則會 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 刪除其傳回的工作結果,請使用 [保留] 參數。 因此,會傳回 Receive-Job 在該時間之前產生的所有結果。

下列命令顯示在尚未完成的作業上使用 [保留] 參數的效果。

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 屬性會顯示作業2仍在執行中。 如果您 Receive-Job 現在使用 Cmdlet 來取得工作結果,則結果會是 [不完整]。 您可以重複使用此 Receive-Job Cmdlet 來取得所有結果。 根據預設,您每次使用它時,只會取得尚未收到的結果,但您可以使用 Receive-Job Cmdlet 的 Keep 參數來保留結果,即使已收到這些結果。

您可以將部分結果寫入檔案,然後在更新時附加較新的結果,或者您可以稍後等候並檢查作業的狀態。

您可以使用 Cmdlet 的 Wait 參數 Receive-Job ,這不會傳回命令提示字元,直到作業完成且所有結果都可使用為止。

您也可以使用 Wait-Job Cmdlet 來等候作業的任何或所有結果。 Wait-Job讓您等候特定作業、所有作業,或完成任何作業。

下列命令會使用等候作業 Cmdlet 來等候識別碼為10的作業。

Wait-Job -ID 10

因此,在作業完成之前,會抑制 PowerShell 提示字元。

您也可以等候一段預定的時間。 此命令使用 Timeout 參數將等候限制為120秒。 當時間到期時,命令提示字元會傳回,但作業會繼續在背景中執行。

Wait-Job -ID 10 -Timeout 120

停止作業

若要停止背景工作,請使用 Stop-Job Cmdlet。 下列命令會啟動作業,以取得系統事件記錄檔中的每個專案。 它會將工作物件儲存在 $ 工作變數中。

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

下列命令會停止工作。 它會使用管線運算子(|)將工作變數中的工作傳送 $ 至 Stop-Job

$job | Stop-Job

刪除作業

若要移除背景工作,請使用 Remove-Job Cmdlet。 下列命令會刪除作業變數中的作業 $ 。

Remove-Job -Job $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 屬性的值為:

連接到遠端伺服器失敗,出現下列錯誤訊息:存取被拒。

另請參閱

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command