次の方法で共有


ジョブについて

概要

PowerShell バックグラウンド ジョブが、現在のセッションと対話せずにバックグラウンドでコマンドまたは式を実行する方法に関する情報を提供します。

詳細説明

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

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

JOB コマンドレット

コマンドレット 説明
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 コマンドレットを使用して、ジョブの結果をファイルに保存できます。 次のコマンドでは、リダイレクト演算子を使用して、ジョブの結果を Results.txt ファイルの $job 変数に保存します。

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 ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

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

部分的な結果をファイルに書き込み、新しい結果を到着時に追加するか、後でジョブの状態を待機してチェックできます。

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

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

次のコマンドでは、Wait-Job コマンドレットを使用して、ID 10 のジョブを待機します。

Wait-Job -ID 10

その結果、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:...

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

$job.ChildJobs[0].JobStateInfo.Reason

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

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

関連項目

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command