about_Job_Details

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.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