共用方式為


about_Jobs

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