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 つ以上の子ジョブで構成されます。 Invoke-Command
の Start-Job
または AsJob パラメーターの使用を開始したジョブでは、親ジョブはエグゼクティブです。 コマンドを実行したり、結果を返したりすることはありません。 コマンドは、実際には子ジョブによって実行されます。 他のコマンドレットの使用を開始したジョブの動作が異なる場合があります。
子ジョブは、親ジョブ オブジェクトの ChildJobs プロパティに格納されます。 ChildJobs プロパティには、1 つまたは複数の子ジョブ オブジェクトを含めることができます。 子ジョブ オブジェクトには、親ジョブとは異なる Name、 ID、および InstanceId があり、親ジョブと子ジョブを個別に、または単位として管理できます。
ジョブの親ジョブと子ジョブを取得するには、Get-Job
コマンドレットの IncludeChildJobs パラメーターを使用します。 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 値を持つ子ジョブのみを取得するには、Get-Job
コマンドレットの ChildJobState パラメーターを使用します。 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
を使用してローカル コンピューターでジョブを開始する場合、ジョブは、エグゼクティブの親ジョブと、コマンドを実行する子ジョブで構成されます。Invoke-Command
の AsJob パラメーターを使用して 1 台以上のコンピューターでジョブを開始する場合、ジョブは、各コンピューターで実行されるジョブごとに、エグゼクティブの親ジョブと子ジョブで構成されます。Invoke-Command
を使用して 1 つ以上のリモート コンピューターでStart-Job
コマンドを実行すると、結果は各リモート コンピューターで実行されるローカル コマンドと同じになります。 このコマンドは、各コンピューターのジョブ オブジェクトを返します。 ジョブ オブジェクトは、エグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブで構成されます。
親ジョブは、すべての子ジョブを表します。 親ジョブを管理する場合は、関連付けられている子ジョブも管理します。 たとえば、親ジョブを停止すると、すべての子ジョブが停止します。 親ジョブの結果を取得すると、すべての子ジョブの結果が取得されます。
ただし、子ジョブを個別に管理することもできます。 これは、ジョブに関する問題を調査したり、Invoke-Command
の AsJob パラメーターを使用して開始された多数の子ジョブのうちの 1 つだけの結果を取得したりする場合に最も役立ちます。
次のコマンドでは、Invoke-Command
の AsJob パラメーターを使用して、ローカル コンピューターと 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 バックグラウンド ジョブとは大きく異なる場合があります。 たとえば、スケジュールされたジョブはディスクに保存されます。特定のセッションにのみ存在しません。 ワークフロー ジョブは中断および再開できます。
カスタム ジョブの管理に使用するコマンドレットは、ジョブの種類によって異なります。 一部のユーザーは、 Get-Job
や Start-Job
などの標準のジョブ コマンドレットを使用します。 その他には、特定の種類のジョブのみを管理する特殊なコマンドレットが付属しています。 カスタム ジョブの種類の詳細については、ジョブの種類に関するヘルプ トピックを参照してください。
ジョブのジョブの種類を検索するには、 Get-Job
コマンドレットを使用します。 Get-Job
は、ジョブの種類ごとに異なるジョブ オブジェクトを返します。 Get-Job
が返すジョブ オブジェクトの PSJobTypeName プロパティの値は、ジョブの種類を示します。
次の表に、PowerShell に付属するジョブの種類を示します。
職務タイプ | 説明 |
---|---|
BackgroundJob | Start-Job コマンドレットの使用を開始しました。 |
RemoteJob | の AsJob パラメーターの使用を開始しました |
Invoke-Command コマンドレットを使用します。 |
|
PSWorkflowJob | ワークフローの AsJob パラメーターの使用を開始しました。 |
PSScheduledJob | ジョブ トリガーによって開始されたスケジュールされたジョブのインスタンス。 |
CIMJob | コマンドレットの AsJob パラメーターの使用を開始しました |
CDXML モジュール。 | |
WMIJob | コマンドレットの AsJob パラメーターの使用を開始しました |
WMI モジュール。 | |
PSEventJob | を使用してRegister-ObjectEvent を指定して作成されます。 |
action と 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
関連項目
PowerShell