about_Job_Details
簡短描述
提供有關本機和遠端電腦上背景工作的詳細數據。
詳細描述
本主題說明背景工作的概念,並提供PowerShell中背景工作運作方式的技術資訊。
本主題是about_Jobs、about_Thread_Jobs和about_Remote_Jobs主題的補充。
關於背景工作
背景作業會以異步方式執行命令或表達式。 它可能會執行 Cmdlet、函式、腳本或任何其他命令型工作。 其設計目的是要執行需要較長時間的命令,但您可以使用命令在背景中執行任何命令。
當同步命令執行時,PowerShell 命令提示字元會隱藏,直到命令完成為止。 但是背景工作不會隱藏 PowerShell 提示字元。 啟動背景作業的命令會傳回作業物件。 提示會立即傳回,讓您可以在背景作業執行時處理其他工作。
不過,當您啟動背景工作時,即使作業執行非常快,也不會立即取得結果。 傳回的作業物件包含作業的實用資訊,但不包含作業結果。 您必須執行個別的命令,才能取得作業結果。 您也可以執行命令來停止作業、等候作業完成,以及刪除作業。
為了讓背景作業的時間與其他命令無關,每個背景作業都會在自己的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。
在遠端電腦上啟動背景工作
您可以在本機或遠端電腦上建立和管理背景工作。 若要從遠端執行背景工作,請使用 Cmdlet 的 Invoke-Command
AsJob 參數,或使用 Invoke-Command
Cmdlet 從遠端執行Start-Job
命令。 您也可以在互動式會話中啟動背景工作。
如需遠端背景工作的詳細資訊,請參閱 about_Remote_Jobs。
子作業
每個背景工作都包含父作業和一或多個子作業。 在開始使用 Start-Job
的工作或的 Invoke-Command
AsJob 參數中,父工作是主管。 它不會執行任何命令或傳回任何結果。 這些命令實際上是由子作業執行。 使用其他 Cmdlet 啟動的作業可能會有不同的運作方式。
子作業會儲存在 父作業物件的 ChildJobs 屬性中。 ChildJobs 屬性可以包含一或多個子作業物件。 子作業物件具有 與父作業不同的 Name、 ID 和 InstanceId ,因此您可以個別或單位管理父和子作業。
若要取得作業的父項和子作業,請使用 Cmdlet 的 Get-Job
IncludeChildJobs 參數。 IncludeChildJob 參數是在 Windows PowerShell 3.0 中引進的。
PS> Get-Job -IncludeChildJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Failed True localhost Get-Process
2 Job2 Completed True Server01 Get-Process
3 Job3 Failed False localhost Get-Process
若要取得父作業,且只取得具有特定 State 值的子作業,請使用 Cmdlet 的 Get-Job
ChildJobState 參數。 ChildJobState 參數是在 Windows PowerShell 3.0 中引進的。
PS> Get-Job -ChildJobState Failed
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Failed True localhost Get-Process
3 Job3 Failed False localhost Get-Process
若要取得所有 PowerShell 版本的作業子作業,請使用 父作業的 ChildJob 屬性。
PS> (Get-Job Job1).ChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 Completed True Server01 Get-Process
3 Job3 Failed False localhost Get-Process
您也可以在 Get-Job
子作業上使用 命令,如下列命令所示:
PS> Get-Job Job3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 Failed False localhost Get-Process
子作業的設定取決於您用來啟動作業的命令。
當您使用
Start-Job
在本機計算機上啟動作業時,此作業包含執行命令的執行父工作和子作業。當您使用的 AsJob 參數
Invoke-Command
在一或多部電腦上啟動作業時,此作業包含每部電腦上執行之每個作業的執行父工作和子作業。當您使用
Invoke-Command
在一或多個遠端電腦上執行Start-Job
命令時,結果與在每個遠端電腦上執行的本機命令相同。 此命令會傳回每部計算機的作業物件。 作業物件是由執行父作業和執行命令的一個子作業所組成。
父作業代表所有子作業。 當您管理父作業時,也會管理相關聯的子作業。 例如,如果您停止父工作,則會停止所有子工作。 如果您取得父作業的結果,則會取得所有子作業的結果。
不過,您也可以個別管理子作業。 當您想要調查作業的問題,或只取得使用 AsJob 參數Invoke-Command
啟動的其中一個子作業結果時,這最有用。
下列命令會使用的 Invoke-Command
AsJob 參數,在本機電腦和兩部遠端電腦上啟動背景工作。 命令會將作業儲存在變數中 $j
。
PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob
當您在 中$j
顯示作業的 Name 和 ChildJob 屬性時,它會顯示命令傳回一個工作物件,其中三個子工作,每部電腦各一個。
PS> $j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
當您顯示父作業時,會顯示作業失敗。
PS> $j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
但是當您執行取得 Get-Job
子作業的命令時,輸出會顯示只有一個子作業失敗。
PS> Get-Job -IncludeChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 RemotingJob Failed False localhost,Server...
4 Job4 Completed True localhost Get-Date
5 Job5 Failed False Server01 Get-Date
6 Job6 Completed True Server02 Get-Date
若要取得所有子作業的結果,請使用 Receive-Job
Cmdlet 來取得父作業的結果。 但您也可以取得特定子作業的結果,如下列命令所示。
PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
PowerShell 背景作業的子作業功能可讓您更充分掌控您執行的作業。
工作類型
PowerShell 支援不同工作的不同作業類型。 從 Windows PowerShell 3.0 開始,開發人員可以撰寫「作業來源配接器」,將新的作業類型新增至 PowerShell,並在模組中包含作業來源配接器。 當您匯入模組時,您可以在工作階段中使用新的作業類型。
例如,PSScheduledJob 模組會新增排程的工作,而 PSWorkflow 模組會新增工作流程作業。
自定義作業類型可能與標準 PowerShell 背景工作有很大的不同。 例如,排程的工作會儲存在磁碟上;它們不只存在於特定會話中。 工作流程工作可以暫停並繼續。
您用來管理自定義作業的 Cmdlet 取決於作業類型。 對於某些,您可以使用標準作業 Cmdlet,例如 Get-Job
和 Start-Job
。 其他則隨附只管理特定作業類型的特製化 Cmdlet。 如需自定義作業類型的詳細資訊,請參閱有關作業類型的說明主題。
若要尋找作業的作業類型,請使用 Get-Job
Cmdlet。 Get-Job
會針對不同類型的作業傳回不同的作業物件。 傳回之作業物件的 Get-Job
PSJobTypeName 屬性值表示作業類型。
下表列出 PowerShell 隨附的作業類型。
作業類型 | 描述 |
---|---|
BackgroundJob | 開始使用 Start-Job Cmdlet。 |
RemoteJob | 開始使用 的 AsJob 參數 |
Invoke-Command Cmdlet。 |
|
PSWorkflowJob | 開始使用 工作流程的 AsJob 參數。 |
PSScheduledJob | 作業觸發程式所啟動之排程作業的實例。 |
CIMJob | 從開始使用 Cmdlet 的 AsJob 參數 |
CDXML 模組。 | |
WMIJob | 從開始使用 Cmdlet 的 AsJob 參數 |
WMI 模組。 | |
PSEventJob | 使用Register-ObjectEvent 和指定 建立 |
action 與 Action 參數。 |
注意:使用 Get-Job
Cmdlet 取得特定類型的作業之前,請確認新增作業類型的模組已匯入目前的會話。
否則, Get-Job
不會取得該類型的作業。
範例
下列命令會建立本機背景作業、遠端背景作業、工作流程作業和排程工作。 然後,它會使用 Get-Job
Cmdlet 來取得作業。 Get-Job
不會取得排程工作,但會取得排程作業的任何已啟動實例。
在本機計算機上啟動背景工作。
PS> Start-Job -Name LocalData {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Running True localhost Get-Process
啟動在遠端電腦上執行的背景工作。
PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
建立排程工作
PS> Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
{Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True
建立工作流程。
PS> workflow Test-Workflow {Get-Process}
以作業身分執行工作流程。
PS> Test-Workflow -AsJob -JobName TestWFJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 TestWFJob PSWorkflowJob NotStarted True localhost Get-Process
取得作業。 Get-Job
此命令不會取得排程工作,但會取得已啟動之排程工作的實例。
PS> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Completed True localhost Get-Process
4 RemoteData RemoteJob Completed True Server01 Get-Process
6 TestWFJob PSWorkflowJob Completed True localhost WorkflowJob
8 ScheduledJob PSScheduledJob Completed True localhost Get-Process
若要取得排程的工作,請使用 Get-ScheduledJob
Cmdlet。
PS> Get-ScheduledJob
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True