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

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

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

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

子ジョブ

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

子ジョブは、親ジョブ オブジェクト の ChildJobs プロパティに格納されます。 ChildJobs プロパティには、1 つ以上の子ジョブ オブジェクトを含めできます。 子ジョブ オブジェクトには、親ジョブとは異なる Name、IDInstanceId が含まれています。そのため、親ジョブと子ジョブを個別に、または 1 つの単位として管理できます。

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

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 パラメーター は、3.0 Windows PowerShellで導入されました。

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

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

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

でジョブの Name プロパティと ChildJob $jプロパティを表示すると、コマンドによって、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 バックグラウンド ジョブとは大きく異なる場合があります。 たとえば、スケジュールされたジョブはディスクに保存されます。これらは、特定のセッションにのみ存在しません。 ワークフロー ジョブは中断および再開できます。

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

ジョブのジョブの種類を検索するには、 コマンドレットを使用 Get-Job します。 Get-Job は、ジョブの種類ごとに異なるジョブ オブジェクトを返します。 を返す ジョブ オブジェクトの PSJobTypeName Get-Job プロパティの値は、ジョブの種類を示します。

次の表に、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

ワークフローを作成します。

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

関連項目