PowerShell HelpFile - about_jobs
 記事記号:[me1541] 初版:2011/May/10

この文書は、Windows PowerShellのヘルプ機能で表示される内容を再構成したものです。

トピック
    about_Jobs

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

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

    重要: Start-Job、または Invoke-Command の AsJob パラメーターを使用して開始す
          るバックグラウンド ジョブは、Windows PowerShell リモート処理インフラス
          トラクチャに依存しています。これらの機能を使用するには、バックグラウン
          ド ジョブがローカル コンピューターのみで実行される場合でも、Windows Po
          werShell がリモート処理用に構成されている必要があります。詳細について
          は、「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 コマンドレットが、ジョブを表すジョブ オブジェクトを返しますが、こ
    れには結果は含まれません。バックグラウンド ジョブの結果を取得するには、Recei
    ve-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 は、それまでに生成された結果を取得します。Re
    ceive-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-Comma
                     nd を使用すると、リモートで 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
	
記事で解説しているパソコンの環境
 基本ソフト: Windows 7
 キーワード: Windows PowerShell、ヘルプ、HelpFile、about_jobs
ご利用数: 1859053
感想・要望・問い合わせは こちら