about_Jobs

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

トピック

about_Jobs

概要

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

詳細説明

このトピックでは、ローカル コンピューター上の Windows PowerShell でバックグラウンド ジョブを実行する方法について説明します。リモート コンピューター上でバックグラウンド ジョブを実行する方法の詳細については、「about_Remote_Jobs」を参照してください。

バックグラウンド ジョブを開始すると、ジョブが完了するまでに時間がかかる場合でも、コマンド プロンプトがすぐに返されます。ジョブの実行中は、中断されることなく引き続きセッションで作業できます。

ジョブのコマンドレット

Start-Job

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

Get-Job

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

Receive-Job

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

Stop-Job

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

Wait-Job

1 つまたはすべてのジョブが完了するまで、コマンド プロンプトを表示しないようにします。

Remove-Job

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

Invoke-Command

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

ローカル コンピューターでジョブを開始する方法

ローカル コンピューターでバックグラウンド ジョブを開始するには、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 にパラメーターを指定しないと、現在のセッションで開始されたすべてのジョブが返されます。

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

        PS C:\>Get-Job

        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob Running    True         localhost  Get-Process

また、ジョブ オブジェクトを変数に保存し、以降のコマンドでジョブを表すために使用することもできます。次のコマンドは、ID が 1 であるジョブを取得し、$job 変数に保存します。

       $job = Get-Job -Id 1  

ジョブ オブジェクトには、ジョブが完了したかどうかを示すジョブ ステータスが含まれています。完了したジョブは、ステータスが [完了] または [失敗] になります。また、ジョブはブロックされていたり、実行中であったりする場合もあります。

Get-Job


        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob 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

結果は、テーブルに表示されます。ジョブ ステータスは、[状態] 列に表示されます。

        Id  Name  PSJobTypeName State      HasMoreData  Location   Command
        --  ----  ------------- -----      -----------  --------   -------
        1   Job1  BackgroundJob Complete    True         localhost  Get-Process
        2   Job2  BackgroundJob Running     True         localhost  Get-EventLog -Log Syst...
        3   Job3  BackgroundJob Complete    True         localhost  dir -Path C:\* -Recurse

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

結果の一部をファイルに書き込んで新しい結果が届くたびに追加することも、待機して後でジョブの状態を確認することもできます。

Receive-Job コマンドレットの Wait パラメーターを使用すると、ジョブが完了し、すべての結果が使用できるまで、コマンド プロンプトが返されません。

また、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  PSJobTypeName State    HasMoreData  Location   Command
         --   ----  ------------- -----    -----------  --------   -------
         1    Job1  BackgroundJob Failed   False        localhost  New-Item -Path HKLM:\S...

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

         $job.ChildJobs[0].JobStateInfo.Reason

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

         Connecting to remote server failed with the following error 
         message : Access is denied.

関連項目

about_Remote_Jobs

about_Job_Details

about_Remote に関するページ

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command