about_Job_Details
適用於: Windows PowerShell 2.0, Windows PowerShell 3.0
主題
about_Job_Details
簡短描述
提供關於本機和遠端電腦上背景工作的詳細資料。
詳細描述
本主題說明背景工作的概念,並提供有關背景工作如何在 Windows PowerShell® 中運作的技術資訊。
本主題補充說明 about_Jobs 和 about_Remote_Jobs 主題。
關於背景工作
背景工作會以非同步方式執行命令或運算式。它可能會執行 Cmdlet、函式、指令碼或任何其他以命令為基礎的工作。它已設計成用來執行所需時間較長的命令,但您可以使用它在背景中執行任何命令。
在同步命令執行時,Windows PowerShell 命令提示字元會隱藏起來直到此命令完成為止。但背景工作不會隱藏 Windows PowerShell 提示字元。要啟動背景工作的命令會傳回工作物件。此命令提示會立即傳回,以便您在背景工作執行時處理其他工作。
不過,當您啟動背景工作時,即使工作非常快速地執行,您也不會立即收到結果。傳回的工作物件包含工作的相關實用資訊,但是不包含工作結果。您必須執行個別的命令才能取得工作結果。您也可以執行命令來停止工作、等待工作完成,以及刪除工作。
為了讓背景工作的時機獨立於其他命令,每個背景工作都會在自己的Windows 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 屬性可以包含一或多個子工作物件。子工作物件具有與父工作不同的名稱、識別碼和執行個體識別碼,以便您以個別方式或將父工作和子工作當作一個單位來管理。
若要取得工作的父系和子系工作,請使用 Get-Job Cmdlet 的 IncludeChildJobs 參數。IncludeChildJob 參數是在 Windows PowerShell 3.0 中引進的。
C:\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
若要取得父工作以及只有具特定狀態值的子工作,請使用 Get-Job Cmdlet 的 ChildJobState 參數。ChildJobState 參數是在 Windows PowerShell 3.0 中引進的。
C:\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
若要在所有 Windows PowerShell 版本上取得工作的子工作,請使用父工作的 ChildJob 屬性。
C:\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 命令,如下列命令所示:
C:\PS> Get-Job Job3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 Failed False localhost Get-Process
子工作的設定取決於您用來啟動工作的命令。
當您使用 Start-Job 在本機電腦上啟動工作時,此工作包含高階父工作和負責執行命令的子工作。
當您使用 Invoke-Command 的 AsJob 參數在一或多部電腦上啟動工作時,此工作包含在每部電腦上執行之每個工作的高階父工作和子工作。
當您使用 Invoke-Command 在一或多部遠端電腦上執行 Start-Job 命令時,結果與在每一部遠端電腦上執行的本機命令相同。此命令會傳回每一部電腦的工作物件。此工作物件是由高階父工作以及執行命令的一項子工作所組成。
父工作代表所有的子工作。當您管理父工作時,也會管理相關聯的子工作。例如,如果您停止父工作,所有子工作會跟著停止。如果您收到父工作的結果,您就取得所有子工作的結果。
不過,您也可以個別地管理子工作。當您想要調查某項工作的問題時,或取得使用 Invoke-Command 的 AsJob 參數所啟動之其中一項子工作的結果時,這個方法最有用。(倒單引號字元 ['] 是接續字元)。
下列命令會使用 Invoke-Command 的 AsJob 參數在本機電腦和兩部遠端電腦上啟動背景工作。命令會將工作儲存於 $j 變數中。
PS C:> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob
當您在 $j 中顯示工作的 Name 和 ChildJob 屬性時,它會顯示此命令傳回了具有三個子工作的工作物件 (每一部電腦一個子工作)。
CPS C:> $j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
當您顯示父工作時,它會顯示此工作失敗。
C:\PS> $j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
但是當您執行用於取得子工作的 Get-Job 命令時,輸出會顯示只有一個子工作失敗。
PS C:\> 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 來取得父工作的結果。但您也可以取得特定子工作的結果,如下列命令所示。
C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
Windows PowerShell 背景工作的子工作功能可讓您更充分地掌控您所執行的工作。
工作類型
Windows PowerShell 針對不同的工作 (task) 支援不同類型的工作 (job)。從 Windows PowerShell 3.0 中,開發人員可以撰寫「工作來源配接器」,以將新的工作類型新增至 Windows PowerShell 並在模組中包含工作來源配接器。當您匯入模組時,您可以在您的工作階段中使用新的工作類型。
例如,PSScheduledJob 模組會新增排程的工作,而 PSWorkflow 模組會新增工作流程工作。
自訂工作類型可能與標準 Windows PowerShell 背景工作明顯不同。例如,排程的工作會儲存在磁碟上;它們不只存在特定的工作階段中。工作流程工作可以暫停並繼續。
您用來管理自訂工作的 Cmdlet 會視工作類型而定。對於某些工作類型,您會使用標準工作 Cmdlet,例如 Get-Job 和 Start-Job。其他工作類型會隨附特殊化 Cmdlet,僅限管理特殊類型的工作。如需自訂工作類型的詳細資訊,請參工作類型的相關閱說明主題。
若要尋找工作的工作類型,請使用 Get-Job Cmdlet。Get-Job 會對不同類型的工作傳回不同的工作物件。Get-Job 傳回之工作物件的 PSJobTypeName 屬性值表示工作類型。
下表列出 Windows PowerShell 隨附的工作類型。
Job Type Description
-------- -----------
BackgroundJob Started by using the Start-Job cmdlet.
RemoteJob Started by using the AsJob parameter of the
Invoke-Command cmdlet.
PSWorkflowJob Started by using the AsJob parameter of a
workflow.
PSScheduledJob An instance of a scheduled job started by
a job trigger.
CIMJob Started by using the AsJob parameter of
a cmdlet from a CDXML module.
WMIJob Started by using the AsJob parameter of
a cmdlet from a WMI module.
PSEventJob Created by running Register-ObjectEvent
and specifying an action with the Action
parameter.
注意:
使用 Get-Job Cmdlet 來取得特定類型的工作之前,請確認新增工作類型的模組已匯入目前的工作階段中。否則,Get-Job 不會取得該類型的工作。
範例
下列命令會建立本機背景工作、遠端背景工作、工作流程工作和排程的工作。然後,它會使用 Get-Job Cmdlet 來取得工作。Get-Job 不會取得排程的工作,但它會取得排程工作的所有已啟動執行個體。
# Start a background job on the local computer.
PS C:\> Start-Job -Name LocalData {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Running True localhost Get-Process
# Start a background job that runs on a remote computer.
PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
# Create a scheduled job
PS C:\> 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 a workflow.
PS C:\> workflow Test-Workflow {Get-Process}
# Run the workflow as a job.
PS C:\> Test-Workflow -AsJob -JobName TestWFJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 TestWFJob PSWorkflowJob NotStarted True localhost Get-Process
# Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
instances of the scheduled job that are started.
PS C:\> 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
# To get scheduled jobs, use the Get-ScheduledJob cmdlet.
PS C:\> 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-ScheduleJob