about_remote_jobs
主題
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:GET CONTENT
若要隨時檢視 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