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