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、ID、InstanceId が含まれています。そのため、親ジョブと子ジョブを個別に、または 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-Command1 つ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
関連項目
フィードバック
フィードバックの送信と表示