トピック
  about_Job_Details

簡易説明
  ローカル コンピューターおよびリモート コンピューターでのバックグラウンド ジョブの詳細について説
  明します。

    
詳細説明
   このトピックでは、バックグラウンド ジョブの概念、および Windows PowerShell でどのようにバッ
   クグラウンド ジョブが動作するかの技術情報について説明します。

   このトピックは、「about_Jobs」および「about_Remote_Jobs」を補足するものです。

   重要: Start-Job、または Invoke-Command の AsJob パラメーターを使用して開始するバックグラ
         ウンド ジョブは、Windows PowerShell リモート処理インフラストラクチャに依存しています。これ
         らの機能を使用するには、バックグラウンド ジョブがローカル コンピューターのみで実行される場合で
         も、Windows PowerShell がリモート処理用に構成されている必要があります。詳細については、
         「about_Remote_Requirements」を参照してください。


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

    同期コマンドが実行されている場合、コマンドが完了するまで、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 があるため、親ジョブと子ジョブは個々に、または
    まとめて管理することができます。

    ジョブ内の親ジョブと子ジョブを表示するには、次のコマンドに示すように、Get-Job コマンドレット
    を使用して親ジョブを取得し、次にこのジョブをパイプを介して Format-List コマンドに渡します。こ
    れにより、オブジェクトの Name プロパティおよび ChildJobs プロパティが表示されます。

        C:\PS> get-job | format-list -property Name, ChildJobs

        Name          : Job1
        ChildJobs     : {Job2}


    次のコマンドに示すように、子ジョブに Get-Job コマンドを使用することもできます。

        C:\PS> get-job job2

        Id    Name   State      HasMoreData   Location    Command
        --    ----   -----      -----------   --------    -------
        2     Job2   Completed  True          localhost   get-process



    子ジョブの構成は、ジョブの開始に使用するコマンドによって異なります。

       -- ローカル コンピューターで Start-Job を使用してジョブを開始する場合、ジョブは、エグゼ
          クティブである親ジョブと、コマンドを実行する子ジョブから構成されます。

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

       -- 1 台以上のリモート コンピューターで Invoke-Command を使用して Start-Job コマンド
          を実行する場合、結果は、各リモート コンピューターでローカル コマンドを実行した場合と同じ
          になります。このコマンドは、コンピューターごとにジョブ オブジェクトを返します。ジョブ オ
          ブジェクトは、エグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブから構成されます。
    
    親ジョブは、すべての子ジョブを表しています。親ジョブを管理すると、関連する子ジョブも管理すること
    になります。たとえば、親ジョブを停止すると、すべての子ジョブも停止します。親ジョブの結果を取得すると、
    すべての子ジョブの結果も取得されます。

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

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

        C:\PS> $j = invoke-command -computername localhost, Server01, Server02 `
               -command {get-date} -AsJob

    $j 内のジョブの Name プロパティおよび ChildJob プロパティを表示すると、コマンドによってコ
    ンピューターごとに、ジョブ オブジェクトと 3 つの子ジョブが返されたことが示されます。

        C:\PS> $j | format-list name, childjobs

        Name      : Job3
        ChildJobs : {Job4, Job5, Job6}


    親ジョブを表示すると、ジョブが失敗したことが示されます。

        C:\PS> $j

        Id   Name    State   HasMoreData     Location             Command
        --   ----    -----   -----------     --------             -------
        1    Job3    Failed  True            localhost,server... get-date


    ただし、子ジョブごとに Get-Job コマンドを実行すると、1 つの子ジョブのみが失敗したことが示され
    ます。

        PS C:\ps-test> get-job job4, job5, job6

        Id   Name   State      HasMoreData     Location           Command
        --   ----   -----      -----------     --------           -------
        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 -job6 -keep | format-table ComputerName, DateTime -auto

        ComputerName DateTime
        ------------ --------
        Server02     Thursday, March 13, 2008 4:16:03 PM

    Windows PowerShell バックグラウンド ジョブの子ジョブの機能によって、実行するジョブをさらに
    詳細に制御することができます。


関連項目
    about_Jobs
    about_Remote_Jobs
    about_Remote
    Invoke-Command
    Start-Job
    Get-Job
    Wait-Job
    Stop-Job
    Remove-Job
    New-PSSession
    Enter-PSSession
    Exit-PSSession




目次