Share via


Get-Job

取得在目前會話中執行的PowerShell背景工作。

Syntax

Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [[-Id] <Int32[]>]
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-InstanceId] <Guid[]>
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-Name] <String[]>
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-State] <JobState>
   [<CommonParameters>]
Get-Job
   [-IncludeChildJob]
   [-ChildJobState <JobState>]
   [-HasMoreData <Boolean>]
   [-Before <DateTime>]
   [-After <DateTime>]
   [-Newest <Int32>]
   [-Command <String[]>]
   [<CommonParameters>]
Get-Job
   [-Filter] <Hashtable>
   [<CommonParameters>]

Description

Cmdlet Get-Job 會取得 對象,這些物件表示在目前會話中啟動的背景工作。 您可以使用 Get-Job 來取得使用 Start-Job Cmdlet 啟動的作業,或使用任何 Cmdlet 的 AsJob 參數。

如果沒有參數, Get-Job 命令會取得目前會話中的所有作業。 您可以使用 的參數 Get-Job 來取得特定作業。

傳回的作業物件 Get-Job 包含作業的相關實用資訊,但不包含作業結果。 若要取得結果,請使用 Receive-Job Cmdlet。

Windows PowerShell 背景作業是在背景中執行的命令,不需要與目前的會話互動。 一般而言,您會使用背景工作來執行複雜命令,需要很長的時間才能完成。 如需有關 Windows PowerShell 中背景工作的詳細資訊,請參閱 about_Jobs

從 Windows PowerShell 3.0 開始,Get-JobCmdlet 也會取得自定義作業類型,例如工作流程作業和已排程工作的實例。 若要尋找工作的工作類型,可使用工作的 PSJobTypeName 屬性。

若要啟用 Get-Job 以取得自定義作業類型,請在執行 Get-Job 命令之前,先將支援自定義作業類型的模組匯入會話,方法是使用 Import-Module Cmdlet 或使用 或取得模組中的 Cmdlet。 如需有關特定自訂工作類型的資訊,請參閱自訂工作類型功能的文件。

範例

範例 1:取得目前會話中啟動的所有背景工作

這個命令會取得目前工作階段中啟動的所有背景工作。 它不會包含在其他工作階段中建立的工作,即使這類工作是在本機電腦上執行也一樣。

PS C:\> Get-Job

範例 2:使用實例標識元停止作業

這些命令示範如何取得工作的執行個體識別碼,然後使用它來停止工作。 與工作名稱 (這不是唯一的) 不同,執行個體識別碼是唯一的。

第一個命令會 Get-Job 使用 Cmdlet 來取得作業。 它會使用 Name 參數來識別作業。 命令會儲存在變數中傳回的$j作業物件Get-Job。 在這個範例中,只有一個具有指定名稱的工作。 第二個命令會取得變數中$j物件的 InstanceId 屬性,並將它儲存在變數中$ID。 第三個命令會顯示變數的值 $ID 。 第四個命令會使用 Stop-Job Cmdlet 來停止作業。 它會使用 InstanceId 參數來識別作業和 $ID 變數,以代表作業的實例識別碼。

PS C:\> $j = Get-Job -Name Job1
PS C:\> $ID = $j.InstanceID
PS C:\> $ID

Guid
----
03c3232e-1d23-453b-a6f4-ed73c9e29d55

PS C:\> Stop-Job -InstanceId $ID

範例 3:取得包含特定命令的作業

此命令會取得系統上包含 Get-Process 命令的作業。 此命令會使用的 Get-JobCommand 參數來限制擷取的作業。 此命令會使用通配符 (*) ,以取得命令字串中任何位置包含 Get-Process 命令的工作。

PS C:\> Get-Job -Command "*get-process*"

範例 4:使用管線取得包含特定命令的工作

如同上一個範例中的命令,此命令會取得系統上包含 Get-Process 命令的作業。 此命令會使用管線運算符 (|) ,以引號將字串傳送至 Get-Job Cmdlet。 它等同於前一個命令。

PS C:\> "*get-process*" | Get-Job

範例 5:取得尚未啟動的作業

這個命令只會取得已建立但尚未啟動的工作。 這包括已排定在未來執行的工作以及尚未排程的工作。

PS C:\> Get-Job -State NotStarted

範例 6:取得尚未指派名稱的工作

此命令會取得所有作業名稱開頭為作業的作業。 因為 job<number> 是作業的預設名稱,所以此命令會取得所有沒有明確指派名稱的作業。

PS C:\> Get-Job -Name Job*

範例 7:使用作業物件來代表命令中的作業

此範例示範如何使用 Get-Job 來取得作業對象,然後示範如何使用作業物件來代表命令中的作業。

第一個命令會 Start-Job 使用 Cmdlet 來啟動在本機電腦上執行 Get-Process 命令的背景作業。 此命令會使用的 Start-JobName 參數,將易記名稱指派給作業。 第二個命令會使用 Get-Job 來取得作業。 它會使用的 Get-JobName 參數來識別作業。 命令會將產生的作業物件儲存在變數中 $j 。 第三個命令會顯示變數中 $j 作業物件的值。 State 屬性的值會顯示作業已完成。 HasMoreData 屬性的值顯示有來自尚未抓取之工作的可用結果。 第四個命令會 Receive-Job 使用 Cmdlet 來取得作業的結果。 它會使用變數中的 $j 作業物件來表示作業。 您也可以使用管線運算子將作業物件傳送至 Receive-Job

PS C:\> Start-Job -ScriptBlock {Get-Process} -Name MyJob
PS C:\> $j = Get-Job -Name MyJob
PS C:\> $j
Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
6      MyJob           BackgroundJob   Completed     True            localhost            Get-Process

PS C:\> Receive-Job -Job $j
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    124       4    13572      12080    59            1140 audiodg
    783      16    11428      13636   100             548 CcmExec
     96       4     4252       3764    59            3856 ccmsetup
...

範例 8:取得所有作業,包括由不同方法啟動的作業

這個範例示範 Get-Job Cmdlet 可以取得目前會話中啟動的所有作業,即使它們是使用不同的方法啟動也一樣。

第一個命令會 Start-Job 使用 Cmdlet 在本機電腦上啟動作業。 第二個命令會使用 Cmdlet 的 Invoke-CommandAsJob 參數,在 S1 計算機上啟動作業。 即使工作中的命令是在遠端電腦上執行,還是會在本機電腦上建立工作物件,因此您可以使用本機命令來管理工作。 第三個Start-Job命令會Invoke-Command使用 Cmdlet 在 S2 計算機上執行命令。 藉由使用此方法,作業物件會在遠端電腦上建立,因此您可以使用遠端命令來管理作業。 第四個命令會使用 Get-Job 來取得儲存在本機電腦上的作業。 Windows PowerShell 3.0 中引進的作業 PSJobTypeName 屬性會顯示使用 Cmdlet 啟動的本機作業是背景作業Start-Job,而使用 Invoke-Command Cmdlet 在遠端會話中啟動的工作則是遠端作業。 第五個Get-Job命令會使用 Invoke-Command 在 S2 計算機上執行命令。範例輸出會顯示命令的結果Get-Job。 在 S2 電腦上,工作顯示為本機工作。 計算機名稱是localhost,而作業類型是背景工作。如需如何在遠端電腦上執行背景工作的詳細資訊,請參閱 about_Remote_Jobs

PS C:\> Start-Job -ScriptBlock {Get-EventLog System}
PS C:\> Invoke-Command -ComputerName S1 -ScriptBlock {Get-EventLog System} -AsJob
PS C:\> Invoke-Command -ComputerName S2 -ScriptBlock {Start-Job -ScriptBlock {Get-EventLog System}}
PS C:\> Get-Job
Id     Name       PSJobTypeName   State         HasMoreData     Location        Command
--     ----       -------------   -----         -----------     --------        -------
1      Job1       BackgroundJob   Running       True            localhost       Get-EventLog System
2      Job2       RemoteJob       Running       True            S1              Get-EventLog System

PS C:\> Invoke-Command -ComputerName S2 -ScriptBlock {Start-Job -ScriptBlock {Get-EventLog System}}
Id    Name     PSJobTypeName  State      HasMoreData   Location   Command
--    ----     -------------  -----      -----------   -------    -------
4     Job4     BackgroundJob  Running    True          localhost  Get-Eventlog System

範例 9:調查失敗的工作

此命令示範如何使用傳回的 Get-Job 作業對象來調查作業失敗的原因。 它也會示範如何取得每個工作的子工作。

第一個命令會 Start-Job 使用 Cmdlet 在本機電腦上啟動作業。 傳回的作業物件 Start-Job 會顯示作業失敗。 State 屬性的值是 Failed。

第二個命令會 Get-Job 使用 Cmdlet 來取得作業。 命令使用點方法,取得物件的 JobStateInfo 屬性值。 它會使用管線運算符將 JobStateInfo 屬性中的物件傳送至 Format-List Cmdlet,以格式化清單中物件的所有屬性 (*) 。命令的結果 Format-List 顯示作業的 Reason 屬性值為空白。

第三個命令會調查更多。 它會使用 Get-Job 命令來取得作業,然後使用管線運算符將整個作業物件傳送至 Format-List Cmdlet,以顯示清單中作業的所有屬性。作業物件中所有屬性的顯示會顯示作業包含名為Job2的子作業。

第四個命令會使用 Get-Job 來取得代表 Job2 子作業的作業物件。 這是命令實際於其中執行的工作。 它會使用 dot 方法來取得 JobStateInfo 屬性的 Reason 屬性。結果顯示作業因為拒絕存取錯誤而失敗。 在此情況下,使用者忘記在啟動 Windows PowerShell 時使用 [以系統管理員身分執行] 選項。因為背景工作使用 Windows PowerShell 的遠端功能,所以計算機必須設定為遠端執行作業,即使作業在本機計算機上執行也一定。如需遠端處理 Windows PowerShell 需求的相關信息,請參閱about_Remote_Requirements。 如需疑難排解秘訣,請參閱 about_Remote_Troubleshooting

PS C:\> Start-Job -ScriptBlock {Get-Process}
Id     Name       PSJobTypeName   State       HasMoreData     Location             Command
--     ----       -------------   -----       -----------     --------             -------
1      Job1       BackgroundJob   Failed      False           localhost            Get-Process

PS C:\> (Get-Job).JobStateInfo | Format-List -Property *
State  : Failed
Reason :

PS C:\> Get-Job | Format-List -Property *
HasMoreData   : False
StatusMessage :
Location      : localhost
Command       : get-process
JobStateInfo  : Failed
Finished      : System.Threading.ManualReset
EventInstanceId    : fb792295-1318-4f5d-8ac8-8a89c5261507
Id            : 1
Name          : Job1
ChildJobs     : {Job2}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

PS C:\> (Get-Job -Name job2).JobStateInfo.Reason
Connecting to remote server using WSManCreateShellEx api failed. The async callback gave the
following error message: Access is denied.

範例 10:取得篩選的結果

這個範例示範如何使用 Filter 參數取得工作流程工作。 Filter 參數 (在 Windows PowerShell 3.0 中引進) 只適用於自訂工作類型,例如,工作流程工作和已排程的工作。

第一個命令會使用 Workflow 關鍵詞來建立 WFProcess 工作流程。 第二個命令會使用 WFProcess 工作流程的 AsJob 參數,以背景作業的形式執行工作流程。 它使用工作流程的 JobName 參數指定工作的名稱,以及使用工作流程的 PSPrivateMetadata 參數指定自訂識別碼。 第三個命令會使用 Get-Job Filter 參數,依 PSPrivateMetadata 參數中指定的自定義標識符來取得作業。

PS C:\> Workflow WFProcess {Get-Process}
PS C:\> WFProcess -AsJob -JobName WFProcessJob -PSPrivateMetadata @{MyCustomId = 92107}
PS C:\> Get-Job -Filter @{MyCustomId = 92107}
Id     Name            State         HasMoreData     Location             Command
--     ----            -----         -----------     --------             -------
1      WFProcessJob    Completed     True            localhost            WFProcess

範例 11:取得子作業的相關信息

此範例顯示使用 Cmdlet 的 IncludeChildJobChildJobState 參數 Get-Job 的效果。

第一個命令取得目前工作階段中的工作。 輸出包含背景工作、遠端工作,以及已排程工作的數個執行個體。 遠端工作 (Job4) 似乎已失敗。 第二個命令使用的 Get-JobIncludeChildJob 參數。 輸出會新增具有子作業之所有作業的子作業。在此情況下,修訂的輸出會顯示只有Job4的Job5子作業失敗。 第三個命令會使用 ChildJobState 參數搭配 Failed 值。輸出包含所有父作業,而且只有失敗的子工作。 第五個命令會使用 作業的 JobStateInfo 屬性及其 Reason 屬性來探索 Job5 失敗的原因。

PS C:\> Get-Job
Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      Job2            BackgroundJob   Completed     True            localhost            .\Get-Archive.ps1
4      Job4            RemoteJob       Failed        True            Server01, Server02   .\Get-Archive.ps1
7      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
8      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
9      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
10     UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help

PS C:\> Get-Job -IncludeChildJob
Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      Job2            BackgroundJob   Completed     True            localhost           .\Get-Archive.ps1
3      Job3                            Completed     True            localhost           .\Get-Archive.ps1
4      Job4            RemoteJob       Failed        True            Server01, Server02  .\Get-Archive.ps1
5      Job5                            Failed        False           Server01            .\Get-Archive.ps1
6      Job6                            Completed     True            Server02            .\Get-Archive.ps1
7      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
8      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
9      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
10     UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help

PS C:\> Get-Job -Name Job4 -ChildJobState Failed
Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      Job2            BackgroundJob   Completed     True            localhost           .\Get-Archive.ps1
4      Job4            RemoteJob       Failed        True            Server01, Server02  .\Get-Archive.ps1
5      Job5                            Failed        False           Server01            .\Get-Archive.ps1
7      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
8      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
9      UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help
10     UpdateHelpJob   PSScheduledJob  Completed     True            localhost            Update-Help

PS C:\> (Get-Job -Name Job5).JobStateInfo.Reason
Connecting to remote server Server01 failed with the following error message:
Access is denied.

如需詳細資訊,請參閱 about_Remote_Troubleshooting 說明主題。

參數

-After

取得在指定日期和時間之後結束的已完成工作。 輸入 DateTime 物件,例如 Cmdlet 所 Get-Date 傳回的物件或可轉換成 DateTime 物件的字串,例如 Dec 1, 2012 2:00 AM11/06

這個參數只適用於含有 EndTime 屬性的自訂工作類型,例如,工作流程工作和已排程的工作。 它不適用於標準背景工作,例如使用 Cmdlet 建立的 Start-Job 作業。 如需支援此參數的詳細資訊,請參閱工作類型的說明主題。

此參數是在 Windows PowerShell 3.0 引進。

Type:DateTime
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Before

取得在指定日期和時間之前結束的已完成工作。 輸入 DateTime 物件。

這個參數只適用於含有 EndTime 屬性的自訂工作類型,例如,工作流程工作和已排程的工作。 它不適用於標準背景工作,例如使用 Cmdlet 建立的 Start-Job 作業。 如需支援此參數的詳細資訊,請參閱工作類型的說明主題。

此參數是在 Windows PowerShell 3.0 引進。

Type:DateTime
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ChildJobState

只取得具有指定狀態的子工作。 此參數可接受的值為:

  • NotStarted
  • 執行中
  • Completed
  • 失敗
  • 已停止
  • 封鎖
  • 暫止
  • 已中斷連接
  • Suspending
  • 停止中

根據預設, Get-Job 不會取得子作業。 藉由使用 IncludeChildJob 參數, Get-Job 取得所有子作業。 如果您使用 ChildJobState 參數,IncludeChildJob 參數就沒有任何作用。

此參數是在 Windows PowerShell 3.0 引進。

Type:JobState
Accepted values:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Command

將命令陣列指定為字串。 此 Cmdlet 會取得包含指定命令的作業。 預設為所有工作。 您可以使用通配符來指定命令模式。

Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:True

-Filter

指定條件的雜湊表。 此 Cmdlet 會取得滿足所有條件的作業。 輸入索引鍵為工作屬性且值為工作屬性值的雜湊表。

這個參數只適用於自訂工作類型,例如,工作流程工作和已排程的工作。 它不適用於標準背景工作,例如使用 Cmdlet 建立的 Start-Job 作業。 如需支援此參數的詳細資訊,請參閱工作類型的說明主題。

此參數是在 Windows PowerShell 3.0 引進。

Type:Hashtable
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-HasMoreData

指出此 Cmdlet 是否只取得具有指定 HasMoreData 屬性值的作業。 HasMoreData 屬性會指出是否已在目前工作階段中收到所有的工作結果。 若要取得具有更多結果的工作,請指定的值 $True。 若要取得沒有更多結果的工作,請指定的值 $False

若要取得作業的結果,請使用 Receive-Job Cmdlet。

當您使用 Receive-Job Cmdlet 時,它會從其記憶體內部的會話特定記憶體中刪除它所傳回的結果。 當它傳回目前會話中作業的所有結果時,它會將作業$FalseHasMoreData 屬性值設定為) ,表示目前會話中作業沒有任何結果。 使用 的 Keep 參數 Receive-Job 來防止 Receive-Job 刪除結果,以及變更 HasMoreData 屬性的值。 如需詳細資訊,請鍵入 Get-Help Receive-Job

HasMoreData 屬性是目前工作階段特定的屬性。 如果自訂作業類型的結果儲存在工作階段之外,例如排程的工作類型,這會在磁碟上儲存作業結果,您可以使用 Receive-Job 不同工作階段中的 Cmdlet 再次取得作業結果,即使 HasMoreData 的值是 $False。 如需詳細資訊,請參閱自訂工作類型的說明主題。

此參數是在 Windows PowerShell 3.0 引進。

Type:Boolean
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Id

指定這個 Cmdlet 取得之作業的標識子陣列。

識別碼是一個整數,可唯一識別目前工作階段中的工作。 記住和輸入比實例標識碼更容易,但只在目前的會話中是唯一的。 您可以輸入一或多個識別碼,並以逗號分隔。 若要尋找作業的識別碼,請輸入 Get-Job 不含參數的 。

Type:Int32[]
Position:0
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-IncludeChildJob

指出除了父作業之外,此 Cmdlet 還會傳回子作業。

此參數特別適合用於調查工作流程作業,這會 Get-Job 傳回容器父作業和作業失敗,因為失敗的原因會儲存在子作業的屬性中。

此參數是在 Windows PowerShell 3.0 引進。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InstanceId

指定這個 Cmdlet 取得之作業實例識別碼的陣列。 預設為所有工作。

執行個體識別碼是 GUID,可唯一識別電腦上的工作。 若要尋找作業的實體識別碼,請使用 Get-Job

Type:Guid[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Name

指定這個 Cmdlet 取得之作業實例易記名稱的陣列。 輸入工作名稱,或使用萬用字元來輸入工作名稱模式。 根據預設, Get-Job 會取得目前會話中的所有作業。

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:True

-Newest

指定要取得的一些作業。 此 Cmdlet 會取得最近結束的工作。

Newest 參數不會依結束時間順序排序或傳回最新的工作。 若要排序輸出,請使用 Sort-Object Cmdlet。

此參數是在 Windows PowerShell 3.0 引進。

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-State

指定工作狀態。 此 Cmdlet 只會取得處於指定狀態的作業。 此參數可接受的值為:

  • NotStarted
  • 執行中
  • Completed
  • 失敗
  • 已停止
  • 封鎖
  • 暫止
  • 已中斷連接
  • Suspending
  • 停止中

根據預設, Get-Job 取得目前會話中的所有作業。

如需作業狀態的詳細資訊,請參閱 JobState 列舉

Type:JobState
Accepted values:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

輸入

None

您無法使用管線傳送輸入至此 Cmdlet。

輸出

System.Management.Automation.RemotingJob

此 Cmdlet 會傳回代表會話中作業的物件。

備註

工作的 PSJobTypeName 屬性會指出工作的工作類型。 屬性值是由工作類型作者所決定。 下列清單顯示常見的工作類型。

  • BackgroundJob。 使用 Start-Job啟動的本機作業。
  • RemoteJob。 使用 Cmdlet 的 Invoke-CommandAsJob 參數,在 PSSession 中啟動作業。
  • PSWorkflowJob。 使用工作流程 AsJob 一般參數啟動的工作。