次の方法で共有


ジョブについて

概要

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

詳細説明

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

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

ジョブのコマンドレット

コマンドレット 説明
Start-Job ローカルコンピューターでバックグラウンドジョブを開始します。
Get-Job で開始されたバックグラウンドジョブを取得します。
現在のセッション。
Receive-Job バックグラウンドジョブの結果を取得します。
Stop-Job バックグラウンドジョブを停止します。
Wait-Job 1つまたはすべてのジョブが完了するまで、コマンドプロンプトを表示しません。
完了.
Remove-Job バックグラウンドジョブを削除します。
Invoke-Command AsJob パラメーターは、任意のコマンドをバックグラウンドとして実行します。
リモートコンピューター上のジョブ。 また、パラメーターを指定せずに
Invoke-Command任意のジョブコマンドをリモートで実行するには、
開始ジョブコマンドを含めます。

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

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

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

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

Start-Job -ScriptBlock {Get-Process}

この Start-Job コマンドは、ジョブを表すオブジェクトを返します。 ジョブ オブジェクトには、ジョブに関する有用な情報が含まれていますが、ジョブの結果は含まれません。

ジョブオブジェクトを変数に保存し、他のジョブコマンドレットと共に使用してバックグラウンドジョブを管理します。 次のコマンドは、ジョブオブジェクトを開始し、結果として生成されたジョブオブジェクトをジョブ変数に保存し $ ます。

$job = Start-Job -ScriptBlock {Get-Process}

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

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

現在のセッションで開始されたバックグラウンドジョブを表すオブジェクトを取得するには、コマンドレットを使用し 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 = Get-Job -Id 1

ジョブオブジェクトには、ジョブが完了したかどうかを示すジョブの状態が含まれています。 完了したジョブの状態が "完了" または "失敗" になっています。 ジョブもブロックされているか、実行されている可能性があります。

Get-Job

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

ジョブの結果を取得する

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

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

Receive-Job -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
    668       7     2672       6168   104    32.26   488 csrss
# ...

ジョブの結果を変数に保存することもできます。 次のコマンドを実行すると、ジョブ変数のジョブの結果が $ 結果変数に保存され $ ます。

$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 ジョブが完了する前に実行されたコマンドの結果を示しています。

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-JobKeepパラメーターを使用します。 その結果、は、 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コマンドレットを繰り返し使用して、すべての結果を取得することができます。 既定では、これを使用するたびに、まだ受け取っていない結果のみが取得されますが、受信ジョブコマンドレットの 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 = Start-Job -ScriptBlock {Get-EventLog -Log System}

次のコマンドは、ジョブを停止します。 パイプライン演算子 (|) を使用して、ジョブ変数のジョブをに送信し $ Stop-Job ます。

$job | Stop-Job

ジョブの削除

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

Remove-Job -Job $job

失敗したジョブの調査

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

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

$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