共用方式為


about_Job_Details

主題
  about_Job_Details

簡短描述
  提供本機和遠端電腦上的背景工作的詳細資訊。
    
詳細描述
   本主題說明背景工作的概念,並提供背景工作如何在 Windows PowerShell 中作業的技
   術資訊。

   本主題為 about_Jobs 和 about_Remote_Jobs 主題的補充資訊。

   重要:使用 Start-Job 或 Invoke-Command 的 AsJob 參數啟動的背景工作,依存於 
         Windows PowerShell 遠端基礎結構。若要使用這些功能,即使背景工作只是在本機
         電腦上執行,也必須將 Windows PowerShell 設定為使用遠端功能。如需詳細資訊,
         請參閱 about_Remote_Requirements。


 關於背景工作
    背景工作會以非同步方式執行命令或運算式, 可以執行 Cmdlet、函數、指令碼或任何其
    他以命令為基礎的工作。背景工作是針對執行需要花很長時間的命令而設計,但是您可以
    用它來在背景中執行任何命令。

    當非同步命令執行時,Windows PowerShell 命令提示字元會在命令完成後才出現, 但背景
    工作並不會隱藏 Windows PowerShell 提示字元。啟動背景工作的命令會傳回工作物
    件。命令提示會立即傳回,讓您能夠在背景工作執行時,進行其他的工作。
  
    不過,當您啟動背景工作時,即使工作執行得非常快速,您也不會立刻取得結果。傳回的
    工作物件包含有用的工作資訊,但不包含工作結果。您必須執行另一個命令,才能取得工
    作結果。您也可以執行命令來停止工作、等候工作完成以及刪除工作。

    為了使背景工作的計時與其他命令無關,每個背景工作都會在本身的 Windows 
    PowerShell 環境 ("工作階段") 中執行。不過,這可能是暫時的連線,只為了執行這
    項工作而建立,之後就會損毀;或者也可能是永久性的工作階段 (PSSession),可用來
    執行數個相關的工作或命令。


 使用工作 CMDLET
    使用 Start-Job 命令在本機電腦上啟動背景工作。Start-Job 會傳回工作物件。您也
    可以使用 Get-Job Cmdlet 來取得物件以表示在本機電腦上所啟動的工作。

    若要取得工作結果,請使用 Receive-Job 命令。如果工作未完成,Receive-Job 會
    傳回部分的結果。您也可以使用 Wait-Job Cmdlet 來隱藏命令提示字元,直到在工作
    階段中啟動的一或多項工作完成為止。

    若要停止背景工作,請使用 Stop-Job Cmdlet。若要刪除工作,請使用 Remove-Job 
    Cmdlet。

    如需 Cmdlet 如何作業的詳細資訊,請參閱每個 Cmdlet 的說明主題以及 about_Jobs。

 
 在遠端電腦上啟動背景工作
    您可以在本機或遠端電腦上建立及管理背景工作。若要在遠端執行背景工作,請使用 
    Invoke-Command 等 Cmdlet 的 AsJob 參數,或使用 Invoke-Command Cmdlet 在
    遠端執行 Start-Job 命令。您也可以在互動式工作階段中啟動背景工作。

    如需遠端背景工作的詳細資訊,請參閱 about_Remote_Jobs。


 子工作
    每個背景工作都是由父工作和一或多個子工作所組成。在使用 Start-Job 或 
    Invoke-Command 的 AsJob 參數所啟動的工作中,父工作是執行檔, 不會執行任何命
    令或傳回任何結果。命令實際上是由子工作執行  (使用其他 Cmdlet 所啟動的工作作業
    方式可能與此不同)。

    這些子工作是儲存在父工作物件的 ChildJobs 屬性中。ChildJobs 屬性可以包含一或
    多個子工作物件。子工作物件的名稱、識別碼和執行個體識別碼都與父工作不同,所以您
    可以分別或同時管理父工作和子工作。

    若要查看工作中的父工作和子工作,請使用 Get-Job Cmdlet 取得父工作,然後經由管
    道將工作輸出至 Format-List 命令,此工作會顯示物件的 Name 和 ChildJobs 屬性,
    如下列命令所示。

        C:\PS> get-job | format-list -property Name, ChildJobs

        Name          : Job1
        ChildJobs     : {Job2}


    您也可以在子工作上使用 Get-Job 命令,如下列命令所示:

        C:\PS> get-job job2

        Id    Name   State      HasMoreData   Location    Command
        --    ----   -----      -----------   --------    -------
        2     Job2   Completed  True          localhost   get-process


    子工作的組態是依用來啟動工作的命令而定。

       -- 在本機電腦上使用 Start-Job 來啟動工作時,工作是由執行父工作和執行命令的
          子工作所組成。

       -- 在一或多部電腦上使用 Invoke-Command 的 AsJob 參數來啟動工作時,工作是
          由電腦所執行的每個工作的執行父工作和子工作所組成。

       -- 在一或多部遠端電腦上使用 Invoke-Command 來執行 Start-Job 命令時,結果
          與在每個遠端電腦上執行本機命令相同。此命令會針對每部電腦傳回工作物件。此
          工作物件是由執行父工作和執行命令的一個子工作所組成。
    
    父工作表示所有的子工作。在管理父工作時,也會同時管理相關聯的子工作。例如,如果
    您停止父工作,所有的子工作也會停止。如果取得父工作的結果,也會取得所有子工作的
    結果。

    不過,您也可以個別地管理子工作。如果想要調查某項工作的問題,或想要在使用 
    Invoke-Command 的 AsJob 參數所啟動的一些子工作中,只取得其中一項子工作的結
    果,這種做法最有用  (倒引號 [`] 是接續字元)。

    下列命令會使用 Invoke-Command 的 AsJob 參數,在本機電腦及兩部遠端電腦上啟動
    背景工作。命令會將工作儲存在 $j 變數中。

        C:\PS> $j = invoke-command -computername localhost, Server01, Server02 `
               -command {get-date} -AsJob

    當您在 $j 中顯示工作的 Name 和 ChildJob 屬性時,它會顯示命令傳回了具有三項子工作
    的工作物件,每部電腦各一項子工作。

        C:\PS> $j | format-list name, childjobs

        Name      : Job3
        ChildJobs : {Job4, Job5, Job6}


    當您顯示父工作時,它會顯示該工作失敗。

        C:\PS> $j

        Id   Name    State   HasMoreData     Location             Command
        --   ----    -----   -----------     --------             -------
        1    Job3    Failed  True            localhost,server...  get-date


    但是當您在每項子工作上執行 Get-Job 命令時,會顯示只有一項子工作失敗。

        PS C:\ps-test> get-job job4, job5, job6

        Id   Name   State      HasMoreData     Location           Command
        --   ----   -----      -----------     --------           -------
        4    Job4   Completed  True            localhost          get-date
        5    Job5   Failed     False           Server01           get-date
        6    Job6   Completed  True            Server02           get-date


    
    若要取得所有子工作的結果,請使用 Receive-Job Cmdlet 取得父工作的結果。但是您
    也可以取得特定子工作的結果,如下列命令所示。

        C:\PS> receive-job -job6 -keep | format-table ComputerName, 
        DateTime -auto

        ComputerName DateTime
        ------------ --------
        Server02   Thursday, March 13, 2008 4:16:03 PM

    透過 Windows PowerShell 背景工作的子工作功能,您可以對執行的工作擁有更多掌控。


請參閱
    about_Jobs
    about_Remote_Jobs
    about_Remote
    Invoke-Command
    Start-Job
    Get-Job
    Wait-Job
    Stop-Job
    Remove-Job
    New-PSSession
    Enter-PSSession
    Exit-PSSession