共用方式為


about_Job_Details

簡短描述

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

詳細描述

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

本主題是about_Jobs、about_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的 AsJob 參數 Invoke-Command的作業中,父工作是主管。 它不會執行任何命令或傳回任何結果。 這些命令實際上是由子作業執行。 開始使用其他 Cmdlet 的作業可能會有不同的運作方式。

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

若要取得作業的父和子作業,請使用 Cmdlet 的 Get-JobIncludeChildJobs 參數。 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-JobChildJobState 參數。 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 在本機計算機上啟動作業時,作業是由執行命令的主管父工作和子作業所組成。

  • 當您使用的 Invoke-CommandAsJob 參數在一或多部電腦上啟動作業時,此作業包含執行父工作,以及每部電腦上執行之每項工作的子工作。

  • 當您使用 Invoke-Command 在一或多部遠端電腦上執行 Start-Job 命令時,結果會與在每個遠端電腦上執行的本機命令相同。 此命令會傳回每部計算機的作業物件。 作業物件包含執行父工作和執行命令的一個子作業。

父作業代表所有子作業。 當您管理父作業時,也會管理相關聯的子作業。 例如,如果您停止父作業,則會停止所有子作業。 如果您取得父作業的結果,則會取得所有子作業的結果。

不過,您也可以個別管理子作業。 當您想要調查作業的問題,或只取得使用 的 AsJob 參數 Invoke-Command啟動的其中一個子作業結果時,這非常有用。

下列命令會使用的 Invoke-CommandAsJob 參數,在本機電腦和兩部遠端電腦上啟動背景工作。 此命令會將作業儲存在變數中 $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-JobPSJobTypeName 屬性值會指出作業類型。

下表列出 PowerShell 隨附的作業類型。

作業類型 Description
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

Create 工作流程。

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

另請參閱