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