about_Job_Details

簡短描述

提供有關本機和遠端電腦上背景工作的詳細數據。

詳細描述

本主題說明背景工作的概念,並提供PowerShell中背景工作運作方式的技術資訊。

本主題是about_Jobsabout_Thread_Jobsabout_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-CommandAsJob 參數,或使用 Invoke-Command Cmdlet 從遠端執行Start-Job命令。 您也可以在互動式會話中啟動背景工作。

如需遠端背景工作的詳細資訊,請參閱 about_Remote_Jobs

子作業

每個背景工作都包含父作業和一或多個子作業。 在開始使用 Start-Job 的工作或Invoke-CommandAsJob 參數中,父工作是主管。 它不會執行任何命令或傳回任何結果。 這些命令實際上是由子作業執行。 使用其他 Cmdlet 啟動的作業可能會有不同的運作方式。

子作業會儲存在 父作業物件的 ChildJobs 屬性中。 ChildJobs 屬性可以包含一或多個子作業物件。 子作業物件具有 與父作業不同的 NameIDInstanceId ,因此您可以個別或單位管理父和子作業。

若要取得作業的父項和子作業,請使用 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-JobStart-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

另請參閱