次の方法で共有


about_Job_Details

簡単な説明

ローカル コンピューターとリモート コンピューター上のバックグラウンド ジョブに関する詳細を提供します。

詳しい説明

このトピックでは、バックグラウンド ジョブの概念について説明し、PowerShell でのバックグラウンド ジョブの動作に関する技術情報を提供します。

このトピックは、about_Jobs、about_Thread_Jobsおよびabout_Remote_Jobsトピックの補足です。

バックグラウンド ジョブについて

バックグラウンド ジョブは、コマンドまたは式を非同期的に実行します。 コマンドレット、関数、スクリプト、またはその他のコマンド ベースのタスクを実行できます。 これは、長時間かかるコマンドを実行するように設計されていますが、バックグラウンドで任意のコマンドを実行するために使用できます。

同期コマンドを実行すると、コマンドが完了するまで PowerShell コマンド プロンプトは抑制されます。 ただし、バックグラウンド ジョブでは PowerShell プロンプトは抑制されません。 バックグラウンド ジョブを開始するコマンドは、ジョブ オブジェクトを返します。 バックグラウンド ジョブの実行中に他のタスクで作業できるように、プロンプトはすぐに返されます。

ただし、バックグラウンド ジョブを開始すると、ジョブが非常に迅速に実行されても、すぐに結果は得られません。 返されるジョブ オブジェクトには、ジョブに関する有用な情報が含まれていますが、ジョブの結果は含まれません。 ジョブの結果を取得するには、別のコマンドを実行する必要があります。 コマンドを実行してジョブを停止し、ジョブが完了するのを待ち、ジョブを削除することもできます。

バックグラウンド ジョブのタイミングを他のコマンドから独立させるために、各バックグラウンド ジョブは独自の PowerShell セッションで実行されます。 ただし、これは、ジョブを実行するためにのみ作成され、破棄される一時的な接続である場合があります。また、いくつかの関連するジョブまたはコマンドを実行するために使用できる永続的な PSSession を使用することもできます。

ジョブ コマンドレットの使用

コマンドを Start-Job 使用して、ローカル コンピューターでバックグラウンド ジョブを開始します。 Start-Job はジョブ オブジェクトを返します。 コマンドレットを使用して、ローカル コンピューターで開始されたジョブを表すオブジェクトを Get-Job 取得することもできます。

ジョブの結果を取得するには、 コマンドを Receive-Job 使用します。 ジョブが完了していない場合は、 Receive-Job 部分的な結果を返します。 また、 コマンドレットを Wait-Job 使用して、セッションで開始された 1 つまたはすべてのジョブが完了するまでコマンド プロンプトを抑制することもできます。

バックグラウンド ジョブを停止するには、 コマンドレットを使用します Stop-Job 。 ジョブを削除するには、 コマンドレットを使用します Remove-Job

コマンドレットのしくみの詳細については、各コマンドレットのヘルプ トピックを参照し、「 about_Jobs」を参照してください。

リモート コンピューターでのバックグラウンド ジョブの開始

ローカル コンピューターまたはリモート コンピューターでバックグラウンド ジョブを作成および管理できます。 バックグラウンド ジョブをリモートで実行するには、 などのInvoke-Commandコマンドレットの AsJob パラメーターを使用するか、 コマンドレットをInvoke-Command使用してコマンドをリモートでStart-Job実行します。 対話型セッションでバックグラウンド ジョブを開始することもできます。

リモート バックグラウンド ジョブの詳細については、「 about_Remote_Jobs」を参照してください。

子ジョブ

各バックグラウンド ジョブは、親ジョブと 1 つ以上の子ジョブで構成されます。 または の AsJob パラメーターInvoke-Commandを使用してStart-Job開始されたジョブでは、親ジョブはエグゼクティブです。 コマンドを実行したり、結果を返したりすることはありません。 コマンドは、実際には子ジョブによって実行されます。 他のコマンドレットの使用を開始したジョブの動作が異なる場合があります。

子ジョブは、親ジョブ オブジェクトの ChildJobs プロパティに格納されます。 ChildJobs プロパティには、1 つまたは複数の子ジョブ オブジェクトを含めることができます。 子ジョブ オブジェクトには、親ジョブとは異なる NameIDInstanceId があり、親ジョブと子ジョブを個別に、またはユニットとして管理できます。

ジョブの親ジョブと子ジョブを取得するには、 コマンドレットの IncludeChildJobs パラメーターを Get-Job 使用します。 IncludeChildJob パラメーターは、Windows PowerShell 3.0 で導入されました。

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

親ジョブを取得し、特定の State 値を持つ子ジョブのみを取得するには、コマンドレットの ChildJobState パラメーターを Get-Job 使用します。 ChildJobState パラメーターは、Windows PowerShell 3.0 で導入されました。

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

すべてのバージョンの PowerShell でジョブの子ジョブを取得するには、親ジョブの ChildJob プロパティを使用します。

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

次のコマンドに Get-Job 示すように、子ジョブで コマンドを使用することもできます。

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

子ジョブの構成は、ジョブの開始に使用するコマンドによって異なります。

  • を使用 Start-Job してローカル コンピューターでジョブを開始する場合、ジョブは、エグゼクティブ親ジョブと、コマンドを実行する子ジョブで構成されます。

  • の AsJob パラメーターInvoke-Commandを使用して 1 つ以上のコンピューターでジョブを開始すると、ジョブは、各コンピューターで実行されるジョブごとに、エグゼクティブ親ジョブと子ジョブで構成されます。

  • を使用 Invoke-Command して 1 つ以上のリモート コンピューターでコマンドを実行 Start-Job すると、結果は各リモート コンピューターで実行されるローカル コマンドと同じです。 コマンドは、各コンピューターのジョブ オブジェクトを返します。 ジョブ オブジェクトは、エグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブで構成されます。

親ジョブは、すべての子ジョブを表します。 親ジョブを管理する場合は、関連付けられている子ジョブも管理します。 たとえば、親ジョブを停止すると、すべての子ジョブが停止します。 親ジョブの結果を取得すると、すべての子ジョブの結果が得られます。

ただし、子ジョブを個別に管理することもできます。 これは、ジョブに関する問題を調査する場合や、 の AsJob パラメーターを使用して開始された子ジョブの数の 1 つだけの Invoke-Command結果を取得する場合に最も便利です。

次のコマンドでは、 の Invoke-CommandAsJob パラメーターを使用して、ローカル コンピューターと 2 台のリモート コンピューターでバックグラウンド ジョブを開始します。 コマンドは、ジョブを 変数に $j 保存します。

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

$jジョブの Name プロパティと ChildJob プロパティを表示すると、コマンドが 3 つの子ジョブ (コンピューターごとに 1 つずつ) を持つジョブ オブジェクトを返したことを示します。

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

親ジョブを表示すると、ジョブが失敗したことを示します。

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

ただし、子ジョブを Get-Job 取得するコマンドを実行すると、子ジョブが 1 つだけ失敗したという出力が表示されます。

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

すべての子ジョブの結果を取得するには、 コマンドレットを Receive-Job 使用して親ジョブの結果を取得します。 ただし、次のコマンドに示すように、特定の子ジョブの結果を取得することもできます。

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

PowerShell バックグラウンド ジョブの子ジョブ機能を使用すると、実行するジョブをより細かく制御できます。

ジョブの種類

PowerShell では、さまざまなタスクに対してさまざまな種類のジョブがサポートされています。 Windows PowerShell 3.0 以降、開発者は、PowerShell に新しいジョブの種類を追加し、ジョブ ソース アダプターをモジュールに含める "ジョブ ソース アダプター" を記述できます。 モジュールをインポートするときに、セッションで新しいジョブの種類を使用できます。

たとえば、PSScheduledJob モジュールはスケジュールされたジョブを追加し、PSWorkflow モジュールはワークフロー ジョブを追加します。

カスタム ジョブの種類は、標準の PowerShell バックグラウンド ジョブとは大きく異なる場合があります。 たとえば、スケジュールされたジョブはディスクに保存されます。特定のセッションにのみ存在しません。 ワークフロー ジョブは中断および再開できます。

カスタム ジョブの管理に使用するコマンドレットは、ジョブの種類によって異なります。 一部の場合は、 や Start-JobなどのGet-Job標準のジョブ コマンドレットを使用します。 その他には、特定の種類のジョブのみを管理する特殊なコマンドレットが付属しています。 カスタム ジョブの種類の詳細については、ジョブの種類に関するヘルプ トピックを参照してください。

ジョブのジョブの種類を見つけるには、 コマンドレットを使用します Get-JobGet-Job は、さまざまな種類のジョブに対して異なるジョブ オブジェクトを返します。 を返すジョブ オブジェクトGet-JobPSJobTypeName プロパティの値は、ジョブの種類を示します。

次の表に、PowerShell に付属するジョブの種類を示します。

ジョブの種類 説明
BackgroundJob コマンドレットの使用を Start-Job 開始しました。
RemoteJob AsJob パラメーターの使用を開始しました
Invoke-Command コマンドレットを使用します。
PSWorkflowJob ワークフローの AsJob パラメーターの使用を開始しました。
PSScheduledJob ジョブ トリガーによって開始されたスケジュールされたジョブのインスタンス。
CIMJob からコマンドレットの AsJob パラメーターの使用を開始しました
CDXML モジュール。
WMIJob からコマンドレットの AsJob パラメーターの使用を開始しました
WMI モジュール。
PSEventJob を使用してRegister-ObjectEvent 作成され、
Action パラメーターを使用して アクションを実行 します。

注: コマンドレットを Get-Job 使用して特定の種類のジョブを取得する前に、ジョブの種類を追加するモジュールが現在のセッションにインポートされていることを確認します。 それ以外の場合、 Get-Job その型のジョブは取得されません。

次のコマンドは、ローカル バックグラウンド ジョブ、リモート バックグラウンド ジョブ、ワークフロー ジョブ、スケジュールされたジョブを作成します。 次に、 コマンドレットを Get-Job 使用してジョブを取得します。 Get-Job はスケジュールされたジョブを取得しませんが、スケジュールされたジョブの開始インスタンスを取得します。

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

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

リモート コンピューターで実行されるバックグラウンド ジョブを開始します。

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

スケジュールされたジョブを作成する

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

ワークフローをCreateします。

PS> workflow Test-Workflow {Get-Process}

ワークフローをジョブとして実行します。


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

ジョブを取得します。 コマンドは Get-Job スケジュールされたジョブを取得しませんが、開始されたスケジュールされたジョブのインスタンスを取得します。

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

スケジュールされたジョブを取得するには、 コマンドレットを使用します Get-ScheduledJob

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

こちらもご覧ください