關於作業詳細資料
簡短描述
提供有關本機和遠端電腦上背景工作的詳細資料。
詳細描述
本主題說明背景工作的概念,並提供有關如何在 PowerShell 中使用背景工作的技術資訊。
本主題是about_Jobs和about_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