主題
    about_Remote_Jobs

簡短描述
    說明如何在遠端電腦執行背景工作。

詳細描述
    背景工作是以非同步方式執行、與目前工作階段沒有互動的命令。命令提示會立即傳回,
    而且您可以在工作執行的同時繼續使用工作階段。

    根據預設,背景工作是在本機電腦執行。不過,您可以使用幾個不同的程序,在遠端電腦
    執行背景工作。

    本主題說明如何在遠端電腦執行背景工作。如需如何在本機電腦執行背景工作的詳細資
    訊,請參閱 about_Jobs。如需背景工作的詳細資訊,請參閱 about_Job_Details。


 遠端背景工作

    您可以使用三種不同的方法,在遠端電腦執行背景工作。

    -- 啟動與遠端電腦之間的互動式工作階段,並在互動式工作階段中啟動工作。這些程序
       與執行本機工作相同,不過所有的動作都是在遠端電腦執行。

    -- 在遠端電腦執行會將其結果傳回本機電腦的背景工作。如果您想要收集背景工作的結
       果,並將這些結果保存在本機電腦的集中位置,請使用這種方法。

    -- 在遠端電腦執行會將其結果保存在遠端電腦的背景工作。如果將工作資料保存在執行
       端電腦比較安全,請使用這種方法。 

 在互動式工作階段中啟動背景工作

    您可以啟動與遠端電腦之間的互動式工作階段,然後在互動式工作階段期間啟動背景工作。
    如需互動式工作階段的詳細資訊,請參閱 about_Remote 以及 Enter-PSSession。

    在互動式工作階段中啟動背景工作的程序,與在本機電腦啟動背景工作的程序幾乎完全相
    同。不過,所有的作業都是在遠端電腦進行,而不是本機電腦。


    步驟 1:ENTER-PSSESSION

    使用 Enter-PSSession Cmdlet 啟動與遠端電腦之間的互動式工作階段。您可以使用 
    Enter-PSSession 的 ComputerName 參數建立互動式工作階段的暫時連線。或者,您也
    可以使用 Session 參數,在 Windows PowerShell 工作階段 (PSSession) 中執行互動式
    工作階段。

    下列命令會在 Server01 電腦啟動互動式工作階段。
  
        C:\PS> Enter-PSSession -computername Server01

    命令提示字元會變更,表示您現在已連線到 Server01 電腦。

        Server01\C:>


    步驟 2:START-JOB

    若要在工作階段中啟動背景工作,請使用 Start-Job Cmdlet。

    下列命令執行的背景工作會取得 Server01 電腦上 Windows PowerShell 事件記錄檔中的事
    件。Start-Job Cmdlet 會傳回代表該工作的物件。

    這個命令會將工作物件儲存在 $job 變數中。

        Server01\C:> $job = start-job -scriptblock {get-eventlog "Windows PowerShell"}
   
    在工作執行期間,您可以使用互動式工作階段來執行其他命令,包括其他背景工作。不過,
    您必須讓互動式工作階段保持開啟,直到工作完成為止。如果您結束工作階段,工作會中
    斷,而結果也會遺失。



    步驟 3:GET-JOB

    若要得知工作是否已完成,請顯示 $job 變數的值,或使用 Get-Job Cmdlet 取得工作。下
    列命令會使用 Get-Job Cmdlet 顯示工作。

        Server01\C:> get-job $job

        SessionId  Name  State      HasMoreData  Location   Command
        ---------  ----  -----      -----------  --------   -------
        1          Job1  Complete   True         localhost  get-eventlog "Windows PowerShell"
   
    Get-Job 輸出顯示工作正在 "localhost" 電腦執行,因為工作是在相同的電腦 (在本例中為 
    Server01) 啟動及執行。
    


    步驟 4:RECEIVE-JOB

    若要取得工作的結果,請使用 Receive-Job Cmdlet。您可以在互動式工作階段中顯示結
    果,或是將結果儲存到遠端電腦的檔案。下列命令會取得 $job 變數中的工作結果。這個
    命令會使用重新導向運算子 (>),將工作的結果儲存在 Server01 電腦的 PsLog.txt 檔案中。

        Server01\C:> receive-job $job > c:\logs\PsLog.txt



    步驟 5:EXIT-PSSESSION

    若要結束互動式工作階段,請使用 Exit-PSSession Cmdlet。命令提示字元會變更,表
    示您已回到本機電腦的原始工作階段。

        Server01\C:> Exit-PSSession
        C:\PS>
         


    步驟 6:INVOKE-COMMAND:取得內容
     
    若要隨時檢視 Server01 電腦上 PsLog.txt 檔案的內容,請啟動另一個互動式工作階段,或執
    行遠端命令。若您想使用多個命令來調查及管理 PsLog.txt 檔案中的資料,這種類型的命
    令在 PSSession (固定連線) 中執行的成效最好。如需 PSSession 的詳細資訊,請參閱 
    about_PSSessions。

    下列命令會使用 New-PSSession Cmdlet 建立連線到 Server01 電腦的 PSSession,然後使
    用 Invoke-Command Cmdlet 在 PSSession 中執行 Get-Content 命令,以檢視檔案的內
    容。

        C:\PS> $s = new-pssession -computername Server01
        C:\PS> invoke-command -session $s -scriptblock {get-content c:\logs\pslog.txt}


       
 啟動將結果傳回本機電腦的遠端工作 (ASJOB)

    若要在遠端電腦啟動將命令結果傳回本機電腦的背景工作,請使用如 Invoke-Command 
    這類 Cmdlet 的 AsJob 參數。

    使用 AsJob 參數時,即使工作是在遠端電腦執行,實際上仍會在本機電腦建立工作物件。當
    工作完成時,結果會傳回到本機電腦。

    您可以使用包含名詞 Job 的 Cmdlet (Job Cmdlet) 來管理任何 Cmdlet 建立的所有工作。許
    多具有 AsJob 的 Cmdlet 都不會使用 Windows PowerShell 遠端功能,因此即使是在未設定
    遠端功能以及不符合遠端功能需求的電腦上,您都可以使用這些 Cmdlet。
 

    步驟 1:INVOKE-COMMAND -ASJOB

    下列命令會使用 Invoke-Command 的 AsJob 參數,在 Server01 電腦啟動背景工作。該
    工作會執行 Get-Eventlog 命令,以取得系統記錄檔中的事件。您可以使用 JobName 參
    數來指定工作的顯示名稱。

       invoke-command -computername Server01 -scriptblock 
       {get-eventlog system} -asjob 

    此命令的結果與下列樣本輸出類似。


       SessionId   Name    State      HasMoreData     Location   Command
       ---------   ----    -----      -----------     --------   -------
       1           Job1    Running    True            Server01   get-eventlog system


    使用 AsJob 參數時,Invoke-Command 傳回的工作物件類型與 Start-Job 傳回的類型
    相同。您可以將工作物件儲存在變數中,或是使用 Get-Job 命令取得工作。

    請注意,Location 屬性的值顯示工作是在 Server01 電腦執行。 


    步驟 2:GET-JOB

    若要管理使用 Invoke-Command Cmdlet 之 AsJob 參數啟動的工作,請使用 Job Cmdlet。
    由於代表遠端工作的工作物件是在本機電腦上,因此您不需要執行遠端命令來管理工作。 

    若要判斷工作是否已完成,請使用 Get-Job 命令。下列命令會取得在目前工作階段中啟
    動的所有工作。

        get-job

    因為遠端工作是在目前的工作階段中啟動,所以本機 Get-Job 命令會取得該工作。工作
    物件的 State 屬性顯示此命令已成功完成。
       
       SessionId   Name   State      HasMoreData     Location   Command
       ---------   ----   -----      -----------     --------   -------
       1           Job1   Completed  True            Server01   get-eventlog system



    步驟 3:RECEIVE-JOB

    若要取得工作的結果,請使用 Receive-Job Cmdlet。因為工作結果會自動傳回到工作物
    件所在的電腦,所以您可以使用本機 Receive-Job 命令取得這些結果。

    下列命令會使用 Receive-Job Cmdlet 取得工作的結果。它是使用工作階段識別碼來識
    別工作。這個命令會將工作結果儲存在 $results 變數中。您也可以將結果重新導向至檔案。

       $results = receive-job -id 1
    


 啟動將結果保留在遠端電腦的遠端工作

    若要在遠端電腦執行將命令結果保留在遠端電腦的背景工作,請使用 Invoke-Command 
    Cmdlet 在遠端電腦執行 Start-Job 命令。您可以使用這種方法,在多部遠端電腦執行
    背景工作。

    從遠端執行 Start-Job 命令時,工作物件是在遠端電腦建立,而且工作結果也會保留在
    遠端電腦。
    從工作的角度來看,所有的作業都是本機作業。您只是從遠端執行命令來管理遠端電腦上
    的本機工作。


    步驟 1:INVOKE-COMMAND START-JOB

    使用 Invoke-Command Cmdlet 在遠端電腦執行 Start-Job 命令。

    這個命令需要有 PSSession (固定連線)。如果您使用 Invoke-Command 的 ComputerName 
    參數建立暫時連線,則當傳回工作物件時,即會將 Invoke-Command 命令視為已完成,因
    而會關閉暫時連線並取消工作。
 
    下列命令會使用 New-PSSession Cmdlet,建立連線至 Server01 電腦的 PSSession。這個
    命令會將 PSSession 儲存在 $s 變數中。

        $s = new-pssession -computername Server01


    下一個命令會使用 Invoke-Command Cmdlet,在 PSSession 中執行 Start-Job 命令。
    Start-Job 命令和 Get-Eventlog 命令會以大括號括住。

       invoke-command -session $s -scriptblock {start-job -scriptblock {get-eventlog system}}

    其結果與下列樣本輸出類似。


       Id       Name    State      HasMoreData     Location   Command
       --       ----    -----      -----------     --------   -------
       2        Job2    Running    True            Localhost  get-eventlog system

    從遠端執行 Start-Job 命令時,Invoke-Command 傳回的工作物件類型與 
    Start-Job 傳回的類型相同。您可以將工作物件儲存在變數中,或是使用 Get-Job 命
    令取得工作。

    請注意,即使工作是在 Server01 電腦執行,Location 屬性的值還是會顯示工作是在本機電
    腦 (稱為 "LocalHost") 執行。因為工作物件是在 Server01 電腦建立,而且工作是在相同的
    電腦執行,所以會將它視為本機背景工作。 


    步驟 2:INVOKE-COMMAND GET-JOB

    若要管理遠端背景工作,請使用 Job Cmdlet。由於工作物件位於遠端電腦,因此您必須執
    行遠端命令來取得、停止、等候或擷取工作結果。 

    若要查看工作是否已完成,請使用 Invoke-Command 命令,在連線至 Server01 電腦的 
    PSSession 中執行 Get-Job 命令。

        invoke-command -session $s -scriptblock {get-job}

    此命令會傳回工作物件。工作物件的 State 屬性顯示此命令已成功完成。

       SessionId       Name    State      HasMoreData     Location   Command
       ---------       ----    -----      -----------     --------   -------
       2               Job2    Completed  True            LocalHost   get-eventlog system

    步驟 3:INVOKE-COMMAND RECEIVE-JOB

    若要取得工作的結果,請使用 Invoke-Command Cmdlet,在連線至 Server01 電腦的 
    PSSession 中執行 Receive-Job 命令。

    下列命令會使用 Receive-Job Cmdlet 取得工作的結果。它是使用工作階段識別碼來識
    別工作。這個命令會將工作結果儲存在 $results 變數中。它會使用 Receive-Job 的 
    Keep 參數,將結果保留在遠端電腦的工作快取中。

        $results = invoke-command -session $s -scriptblock 
        {receive-job -sessionid 2 -keep}

    您也可以將結果重新導向至本機或遠端電腦上的檔案。下列命令會使用重新導向運算子,
    將結果儲存在 Server01 電腦上的檔案中。

        invoke-command -session $s -command {receive-job -sessionid 2 > c:\logs\pslog.txt}


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




目錄