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