共用方式為


關於作業詳細資料

簡短描述

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

詳細描述

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

本主題是about_Jobsabout_Remote_Jobs主題的補充。

關於背景工作

背景工作會以非同步方式執行命令或運算式。 它可能會執行 Cmdlet、函式、腳本或任何其他以命令為基礎的工作。 其設計目的是要執行長時間執行的命令,但是您可以使用它在背景中執行任何命令。

執行同步命令時,會隱藏 PowerShell 命令提示字元,直到命令完成。 但背景工作不會隱藏 PowerShell 提示字元。 用來啟動背景工作的命令會傳回工作物件。 提示會立即傳回,讓您可以在背景工作執行時處理其他工作。

不過,當您啟動背景工作時,即使工作的執行速度非常快,也不會立即得到結果。 傳回的工作物件包含工作的相關實用資訊,但不包含工作結果。 您必須執行個別的命令來取得工作結果。 您也可以執行命令來停止作業、等候作業完成,以及刪除作業。

為了讓背景工作的時間與其他命令無關,每個背景工作都會在自己的 PowerShell 環境中執行(「會話」)。 不過,這可以是只為了執行作業而建立的暫時連線,然後終結,或者可以是可用於執行數個相關作業或命令的持續性會話(PSSession)。

使用 JOB CMDLET

使用 [啟動作業] 命令,在本機電腦上啟動背景工作。 開始-作業會傳回工作物件。 您也可以使用「取得作業」 Cmdlet,取得代表在本機電腦上啟動之工作的物件。

若要取得工作結果,請使用接收-作業命令。 如果作業未完成,接收作業會傳回部分結果。 您也可以使用等候作業 Cmdlet 來抑制命令提示字元,直到會話中啟動的一或所有作業完成為止。

若要停止背景工作,請使用 [停止作業] Cmdlet。 若要刪除工作,使用 Remove-Job Cmdlet。

如需 Cmdlet 如何工作的詳細資訊,請參閱每個 Cmdlet 的說明主題,並參閱 about_Jobs。

在遠端電腦上啟動背景工作

您可以在本機或遠端電腦上建立和管理背景工作。 若要從遠端執行背景工作,請使用 Cmdlet 的 AsJob 參數(例如叫用命令),或使用 Invoke 命令 Cmdlet 從遠端執行啟動作業命令。 您也可以在互動式會話中啟動背景工作。

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

子工作

每個背景工作都是由父工作和一或多個子工作所組成。 在使用開始-作業或 AsJob 參數(Invoke)啟動的作業中,父系作業是執行程式。 它不會執行任何命令,也不會傳回任何結果。 子工作實際上會執行命令。 (使用其他 Cmdlet 啟動的工作可能會以不同方式執行)。

子工作會儲存在父工作物件的 ChildJobs 屬性中。 ChildJobs 屬性可以包含一或多個子工作物件。 子工作物件的名稱、識別碼和實例識別碼與父工作不同,因此您可以個別或以一個單位來管理父系和子工作。

若要取得作業的父系和子工作,請使用 IncludeChildJobs 參數的 Get-Job Cmdlet。 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

若要取得父作業,以及僅具有特定狀態值的子工作,請使用 ChildJobState 參數的 Get-Job Cmdlet。 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

您也可以在子工作上使用「取得作業」命令,如下列命令所示:

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

子工作的設定取決於您用來啟動作業的命令。

  • 當您使用 [啟動-作業] 在本機電腦上啟動工作時,此作業包含一個執行父工作,以及一個執行命令的子工作。

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

  • 當您使用 Invoke 命令在一或多部遠端電腦上執行 [啟動作業] 命令時,其結果會與在每部遠端電腦上執行的本機命令相同。 此命令會傳回每部電腦的工作物件。 工作物件是由執行父工作和一個執行命令的子工作所組成。

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

不過,您也可以個別管理子工作。 當您想要調查作業的問題,或只使用調用命令的 AsJob 參數啟動的其中一個子工作的結果時,這非常有用。 (倒引號字元 ['] 是接續字元)。

下列命令會使用 Invoke 命令的 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

若要取得所有子工作的結果,請使用接收-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 模組會新增工作流程工作。

自訂工作類型與標準 Windows PowerShell 背景工作的差異可能大不相同。 例如,排程的工作會儲存在磁片上;它們不會存在於特定會話中。 工作流程作業可以暫停並繼續。

您用來管理自訂工作的 Cmdlet 取決於作業類型。 針對某些部分,您可以使用標準作業 Cmdlet,例如 [作業] 和 [開始-作業]。 有些則是以專門的 Cmdlet 來管理特定類型的作業。 如需自訂工作類型的詳細資訊,請參閱工作類型的說明主題。

若要尋找作業的作業類型,請使用「取得作業」 Cmdlet。 「取得作業」會針對不同類型的作業傳回不同的工作物件。 工作物件的 PSJobTypeName 屬性值會傳回,表示作業類型。

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

作業類型 描述
BackgroundJob 使用 Start-Job Cmdlet 來啟動。
RemoteJob 使用 Invoke 命令的 AsJob 參數來啟動
Cmdlet。
PSWorkflowJob 使用工作流程的 AsJob 參數來啟動。
PSScheduledJob 工作觸發程式啟動的排程工作實例。
CIMJob 從使用 Cmdlet 的 AsJob 參數開始
CDXML 模組。
WMIJob 從使用 Cmdlet 的 AsJob 參數開始
WMI 模組。
PSEventJob 藉由執行 ObjectEvent 並指定來建立
具有動作參數的動作。

注意:使用「取得作業」 Cmdlet 來取得特定類型的作業之前,請先確認新增作業類型的模組已匯入到目前的會話。 否則,取得作業不會取得該類型的作業。

範例

下列命令會建立本機背景工作、遠端背景工作、工作流程工作和排程工作。 然後,它會使用「取得作業」 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

若要取得排程工作,請使用 ScheduledJob Cmdlet。

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

另請參閱

about_Jobs

about_Remote_Jobs

about_Remote

about_Scheduled_Jobs

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

Suspend-Job

Resume-Job

New-PSSession

Enter-PSSession

Exit-PSSession

Register-ScheduledJob

Get-ScheduledJob