about_Jobs

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.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