トピック
    about_Jobs

簡易説明
    Windows PowerShell バックグラウンド ジョブが、現在のセッションと対話することなく、バックグラウ
    ンドでコマンドまたは式を実行する方法について説明します。

詳細説明
    このトピックでは、ローカル コンピューターにおいて Windows PowerShell でバックグラウンド ジョブ
    を実行する方法について説明します。リモート コンピューターでのバックグラウンド ジョブの実行の詳
    細については、「about_Remote_Jobs」を参照してください。
    
    バックグラウンド ジョブを開始すると、ジョブの完了に時間がかかる場合でも、すぐコマンド プロンプ
    トに戻ります。ジョブの実行中に、中断することなく引き続きセッションで作業できます。

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

 
        
 ローカル コンピューターでジョブを開始する方法
    ローカル コンピューターでバックグラウンド ジョブを開始するには、Start-Job コマンドレットを使
    用します。

    Start-Job コマンドを記述するには、ジョブが実行するコマンドを中かっこ ( { } ) で囲みます。
    ScriptBlock パラメーターを使用してコマンドを指定します。

    次のコマンドは、ローカル コンピューターで Get-Process コマンドを実行するバックグラウンド ジョ
    ブを開始します。

        start-job -scriptblock {get-process}


    Start-Job コマンドは、ジョブを表すオブジェクトを返します。ジョブ オブジェクトには、ジョブに
    関する有用な情報が含まれています。ただし、ジョブの結果は含まれません。
    
    変数にジョブ オブジェクトを保存し、この変数と他の Job コマンドレットを使用してバックグラウン
    ド ジョブを管理します。次のコマンドは、ジョブ オブジェクトを開始し、結果のジョブ オブジェクト
    を $job 変数に保存します。

        $job = start-job -scriptblock {get-process}
    
    Get-Job コマンドレットを使用して、現在のセッションで開始されたジョブを表すオブジェクトを取得
    することもできます。Get-Job は、Start-Job が返すのと同じジョブ オブジェクトを返します。

 
 ジョブ オブジェクトの取得

    現在のセッションで開始されたバックグラウンド ジョブを表すオブジェクトを取得するには、Get-Job 
    コマンドレットを使用します。パラメーターが指定されていない場合、Get-Job は現在のセッションで
    開始されたすべてのジョブを返します。

    たとえば、次のコマンドは現在のセッションのジョブを取得します。

	get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Running    True         localhost  get-process


    変数にジョブ オブジェクトを保存し、この変数を使用して後のコマンドでジョブを表すこともできま
    す。次のコマンドは、ID 1 というジョブを取得し、これを $job 変数に保存します。

       $job = get-job -id 1


    ジョブ オブジェクトにはジョブの状態が含まれており、これはジョブが完了したかどうかを示していま
    す。完了したジョブの状態は、"Complete" または "Failed" になります。ジョブはブロックするこ
    とも、実行することもできます。


	get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process



 ジョブの結果の取得

    バックグラウンド ジョブを実行しても、結果は直ちには表示されません。代わりに、Start-Job コマ
    ンドレットが、ジョブを表すジョブ オブジェクトを返しますが、これには結果は含まれません。バック
    グラウンド ジョブの結果を取得するには、Receive-Job コマンドレットを使用します。

    次のコマンドは、Receive-Job コマンドレットを使用してジョブの結果を取得します。$job 変数に
    保存されているジョブ オブジェクトを使用してジョブを特定します。

	receive-job -job $job

     Receive-Job コマンドレットは、ジョブの結果を返します。


           Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
           -------  ------    -----      ----- -----   ------    -- -----------
               103       4    11328       9692    56           1176 audiodg
               804      14    12228      14108   100   101.74  1740 CcmExec
               668       7     2672       6168   104    32.26   488 csrss
	   ...

     ジョブの結果は変数に保存することもできます。次のコマンドは、$job 変数内のジョブの結果を 
     $results 変数に保存します。

	$results = receive-job -job $job

     また、リダイレクト演算子 (>) または Out-File コマンドレットを使用すると、ジョブの結果をフ
     ァイルに保存することもできます。次のコマンドは、リダイレクト演算子を使用して、$job 変数内のジ
     ョブの結果を Results.txt ファイルに保存します。
     


        receive-job -job $job > results.txt


    

 ジョブの一部の結果の取得および維持

    Receive-Job コマンドレットは、バックグラウンド ジョブの結果を返します。ジョブが完了している
    場合は、Receive-Job はジョブの完全な結果を返します。ジョブがまだ実行中の場合は、Receive-
    Job は、それまでに生成された結果を取得します。Receive-Job コマンドを再度実行すると、残りの
    結果を取得することができます。

    Receive-Job が結果を返す場合、既定では、ジョブの結果が保存されているキャッシュから結果が削除
    されます。別の Receive-Job コマンドを実行すると、まだ受け取っていない結果のみを取得します。

    次のコマンドは、ジョブが完了する前の Receive-Job コマンドの実行結果を示しています。


	C:\PS> receive-job -job $job

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec


	C:\PS> receive-job -job $job

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
             68       3     2632        664    29     0.36   1388 ccmsetup
            749      22    21468      19940   203   122.13   3644 communicator
            905       7     2980       2628    34   197.97    424 csrss
           1121      25    28408      32940   174   430.14   3048 explorer

    返されたジョブの結果を Receive-Job が削除しないようにするには、Keep パラメーターを使用しま
    す。それにより、Receive-Job は、このときまでに生成されたすべての結果を返します。

    次のコマンドは、まだ完了していないジョブに Keep パラメーターを使用した結果を示しています。

	C:\PS> receive-job -job $job -keep

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec


	C:\PS> receive-job -job $job -keep

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec
             68       3     2632        664    29     0.36   1388 ccmsetup
            749      22    21468      19940   203   122.13   3644 communicator
            905       7     2980       2628    34   197.97    424 csrss
           1121      25    28408      32940   174   430.14   3048 explorer


    
結果の待機

    完了までに時間がかかるコマンドを実行する場合、ジョブ オブジェクトのプロパティを使用して、ジョ
    ブがいつ完了するかを判断することができます。次のコマンドは、Get-Job オブジェクトを使用して、
    現在のセッションにあるすべてのバックグラウンド ジョブを取得します。

	get-job

    結果は表に表示されます。ジョブの状態は、State 列に表示されます。

        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process
        2   Job2  Running     True         localhost  get-eventlog -log syst...
        3   Job3  Complete    True         localhost  dir -path c:\* -recurse


    この場合、State プロパティは、Job 2 が引き続き実行中であることを示しています。Receive-Job 
    コマンドレットを使用してジョブの結果をすぐに取得すると、結果は不完全になります。Receive-Job コ
    マンドレットを繰り返し使用すると、すべての結果を取得できます。既定では、そのコマンドレットを使
    用するたびに、まだ受け取られていない結果のみを取得しますが、Receive-Job コマンドレットの 
    Keep パラメーターを使用すると、結果が既に受け取られている場合でも結果を保持することができま
    す。

    このとき、結果をファイルに書き込み、その後、新しく受け取った結果が得られたら、それをファイルに
    付加することができます。または、待機して後でジョブの状態を確認することができます。

    または、Wait-Job コマンドレットを使用して、ジョブの結果のいずれかまたは全部が完了するまで待
    つことができます。Wait-Job を使用すると、特定のジョブ、すべてのジョブ、またはいずれかのジョブ
    が完了するまで待つことができます。
  
    次のコマンドは、Wait-Job コマンドレットを使用して、ID 10 のジョブを待ちます。

	wait-job -ID 10

    この結果、ジョブが完了するまで、Windows PowerShell プロンプトは表示されません。

    所定の時間、待機することもできます。次のコマンドは、Timeout パラメーターを使用して、待ち時間
    を 120 秒に制限します。この時間が経過すると、コマンド プロンプトに戻りますが、ジョブはバックグ
    ラウンドで引き続き実行されます。

	wait-job -ID 10 -timeout 120


ジョブの停止

    バックグラウンド ジョブを停止するには、Stop-Job コマンドレットを使用します。次のコマンドは、
    ジョブを開始してシステム イベント ログの各エントリを取得します。このコマンドは、ジョブ オブジ
    ェクトを $job 変数に保存します。

	$job = start-job -scriptblock {get-eventlog -log system}
    
    次のコマンドは、ジョブを停止します。このコマンドは、パイプライン演算子 (|) を使用して、$job 変数
    に保存されたジョブを Stop-Job に送ります。

	$job | stop-job


ジョブの削除

    バックグラウンド ジョブを削除するには、Remove-Job コマンドレットを使用します。次のコマンド
    は、$job 変数内のジョブを削除します。

	remove-job -job $job


失敗したジョブの調査

    ジョブが失敗した原因を見つけるには、ジョブ オブジェクトの Reason サブプロパティを使用します。

    次のコマンドは、必要な資格情報なしでジョブを開始します。このコマンドは、ジョブ オブジェクトを 
    $job 変数に保存します。


         $job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}

         Id   Name  State    HasMoreData  Location   Command
         --   ----  -----    -----------  --------   -------
         1    Job1  Failed   False         localhost  new-item -path HKLM:\S...


    次のコマンドは、Reason プロパティを使用して、ジョブの失敗の原因となったエラー見つけます。

         $job.ChildJobs[0].JobStateInfo.Reason


    この場合、ジョブが失敗したのは、リモート コンピューターがコマンドを実行するために明示的な資格
    情報を必要としたためです。Reason プロパティの値は、次のとおりです。

         リモート サーバーへの接続が失敗し、次のエラー メッセージが返されました。アクセスが拒否さ
         れました。


ジョブ コマンドレット

    Start-Job        ローカル コンピューターでバックグラウンド ジョブを開始します。

    Get-Job          現在のセッションで開始されたバックグラウンド ジョブを取得します。

    Receive-Job      バックグラウンド ジョブの結果を取得します。

    Stop-Job         バックグラウンド ジョブを停止します。

    Wait-Job         1 つまたはすべてのジョブが完了するまでコマンド プロンプトを表示しません。

    Remove-Job       バックグラウンド ジョブを削除します。

    Invoke-Command   AsJob パラメーターは、どのコマンドでも、リモート コンピューターのバックグラウ
                     ンド ジョブとして実行します。Invoke-Command を使用すると、リモートで Start-Job 
                     コマンドなど、どのジョブ コマンドでも実行することができます。

 
関連項目
   about_Remote_Jobs
   about_Job_Details
   about_Remote
   about_PSSessions  
   Start-Job
   Get-Job
   Receive-Job
   Stop-Job
   Wait-Job
   Remove-Job
   Invoke-Command




目次