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」を補足するトピックです。

バックグラウンド ジョブについて

バックグラウンド ジョブは、コマンドまたは式を非同期的に実行します。コマンドレット、関数、スクリプトなどのコマンドベースのタスクを実行できます。バックグラウンド ジョブは長時間にわたるコマンドを実行するよう設計されていますが、どのコマンドもバックグラウンド ジョブを使用すればバックグラウンドで実行できます。

同期コマンドを実行している場合はコマンドが完了するまで Windows PowerShell コマンド プロンプトが表示されませんが、バックグラウンド ジョブの場合は Windows PowerShell プロンプトが非表示になることはありません。バックグラウンド ジョブを開始するコマンドを実行すると、ジョブ オブジェクトが返されます。すぐにプロンプトに戻るため、バックグラウンド ジョブが実行されている間、他のタスクを実行できます。

ただし、バックグラウンド ジョブを開始すると、ジョブが直ちに実行された場合でも結果はすぐには得られません。返されるジョブ オブジェクトには、ジョブに関する有用な情報が含まれていますが、ジョブの結果は含まれていません。ジョブの結果を取得するには、別のコマンドを実行する必要があります。また、ジョブの停止、ジョブの完了までの待機、およびジョブの削除のコマンドも実行できます。

バックグラウンド ジョブのタイミングを他のコマンドから独立させるために、各バックグラウンド ジョブは専用の Windows PowerShell 環境 ("セッション") で実行されます。ただし、これは、特定のジョブの実行用に作成し、後で破棄する一時的な接続にすることも、複数の関連するジョブやコマンドの実行に使用する永続的なセッション (PSSession) にすることもできます。

ジョブ コマンドレットの使用

ローカル コンピューターでバックグラウンド ジョブを開始するには、Start-Job コマンドを使用します。Start-Job を実行すると、ジョブ オブジェクトが返されます。Get-Job コマンドレットを使用して、ローカル コンピューターで開始されたジョブを表すオブジェクトを取得することもできます。

ジョブの結果を取得するには、Receive-Job コマンドを使用します。ジョブが完了していない場合は、Receive-Job から部分的な結果が返されます。また、Wait-Job コマンドレットを使用すると、セッションで開始された 1 つまたはすべてのジョブが完了するまで、コマンド プロンプトを非表示にできます。

バックグラウンド ジョブを停止するには、Stop-Job コマンドレットを使用します。ジョブを削除するには、Remove-Job コマンドレットを使用します。

コマンドレットの動作の詳細については、各コマンドレットのヘルプ トピックおよび「about_Jobs」を参照してください。

リモート コンピューター上のバックグラウンド ジョブの開始

ローカル コンピューターまたはリモート コンピューターで、バックグラウンド ジョブの作成と管理を実行できます。バックグラウンド ジョブをリモートで実行するには、Invoke-Command などのコマンドレットの AsJob パラメーターを使用するか、Invoke-Command コマンドレットを使用して Start-Job コマンドをリモートで実行します。対話型のセッションで、バックグラウンド ジョブを開始することもできます。

リモート バックグラウンド ジョブの詳細については、「about_Remote_Jobs」を参照してください。

子ジョブ

各バックグラウンド ジョブは、親ジョブと 1 つ以上の子ジョブで構成されます。Start-Job、または Invoke-Command の AsJob パラメーターを使用して開始されたジョブでは、親ジョブはエグゼクティブになります。この親ジョブはコマンドを実行せず、結果を返しません。コマンドは、実際には子ジョブによって実行されるためです (他のコマンドレットを使用して開始したジョブでは、動作が異なる場合があります)。

子ジョブは、親ジョブ オブジェクトの ChildJobs プロパティに格納されます。ChildJobs プロパティには、1 つ以上の子ジョブ オブジェクトを含めることができます。子ジョブ オブジェクトには親ジョブとは異なる名前、ID、およびインスタンス ID があるため、親ジョブと子ジョブを個別に管理することも、1 つの単位として管理することもできます。

特定のジョブの親ジョブと子ジョブを取得するには、Get-Job コマンドレットの 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 コマンドレットの 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 を使用してジョブを開始すると、ジョブはエグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブで構成されます。

1 台以上のコンピューターで Invoke-Command の AsJob パラメーターを使用してジョブを開始すると、ジョブは、各コンピューターで実行されるジョブごとに、エグゼクティブ親ジョブと 1 つの子ジョブで構成されます。

1 台以上のリモート コンピューターで Invoke-Command を使用して Start-Job コマンドを実行した場合、結果は、各リモート コンピューターでローカル コマンドを実行した場合と同じになります。コマンドによって各コンピューターにジョブ オブジェクトが返されます。ジョブ オブジェクトは、エグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブで構成されます。

親ジョブは、すべての子ジョブを表しています。親ジョブを管理すると、関連する子ジョブも管理することになります。たとえば、親ジョブを停止すると、すべての子ジョブも停止します。親ジョブの結果を取得すると、すべての子ジョブの結果も取得されます。

一方で、子ジョブを個別に管理することもできます。この方法は、ジョブに関する問題を調べる場合や、Invoke-Command の AsJob パラメーターを使用して開始した多くの子ジョブのうち 1 つのみの結果を取得する場合に便利です (バックティック文字 [`] は連結文字です)。

次のコマンドは、Invoke-Command の AsJob パラメーターを使用して、ローカル コンピューターと 2 台のリモート コンピューターでバックグラウンド ジョブを開始します。ジョブは $j 変数に保存されます。

        PS C:> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
               -Command {Get-Date} -AsJob

$j 内のジョブの Name プロパティと ChildJob プロパティを表示すると、1 つのジョブ オブジェクトと 3 つの子ジョブ (各コンピューターに 1 つずつ) が返されたことが示されます。

        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 コマンドを実行すると、1 つの子ジョブのみが失敗したことが示されます。

        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 コマンドレットを使用して親ジョブの結果を取得します。ただし、次のコマンドが示すように、特定の子ジョブの結果を取得することもできます。

        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 は、さまざまなタスクを実行するための多種多様なジョブをサポートしています。Windows PowerShell 3.0 以降では、開発者が Windows PowerShell に新しいジョブの種類を追加する "ジョブ ソース アダプター" を作成して、モジュールにジョブ ソース アダプターを含めることができます。モジュールをインポートすれば、セッションで新しいジョブの種類を使用できます。

たとえば、PSScheduledJob モジュールではスケジュールされたジョブが追加され、PSWorkflow モジュールではワークフロー ジョブが追加されます。

カスタムのジョブの種類は、標準の Windows PowerShell バックグラウンド ジョブとは大きく異なる場合があります。たとえば、スケジュールされたジョブはディスクに保存され、特定のセッションのみに配置されるわけではありません。ワークフロー ジョブは中断と再開が可能です。

カスタム ジョブを管理するために使用するコマンドレットは、ジョブの種類によって異なります。Get-Job や Start-Job など標準のジョブ コマンドレットを使用する場合もあれば、特定の種類のジョブのみを管理する専用コマンドレットが付属する場合もあります。カスタムのジョブの種類の詳細については、ジョブの種類に関するヘルプ トピックを参照してください。

特定のジョブについてジョブの種類を確認するには、Get-Job コマンドレットを使用します。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 コマンドレットを使用して特定の種類のジョブを取得する前に、ジョブの種類を追加するモジュールが現在のセッションにインポートされていることを確認してください。インポートされていないと、その種類のジョブは Get-Job で取得されません。

次のコマンドを実行すると、ローカルのバックグラウンド ジョブ、リモートのバック グラウンド ジョブ、ワークフロー ジョブ、およびスケジュールされたジョブが作成されます。その後、Get-Job コマンドレットを使用して、ジョブが取得されます。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