about_Job_Details
トピック
about_Job_Details
簡易説明
ローカル コンピューターおよびリモート コンピューターでのバックグラウンド ジョブの詳細について説
明します。
詳細説明
このトピックでは、バックグラウンド ジョブの概念、および Windows PowerShell でどのようにバッ
クグラウンド ジョブが動作するかの技術情報について説明します。
このトピックは、「about_Jobs」および「about_Remote_Jobs」を補足するものです。
重要: Start-Job、または Invoke-Command の AsJob パラメーターを使用して開始するバックグラ
ウンド ジョブは、Windows PowerShell リモート処理インフラストラクチャに依存しています。これ
らの機能を使用するには、バックグラウンド ジョブがローカル コンピューターのみで実行される場合で
も、Windows PowerShell がリモート処理用に構成されている必要があります。詳細については、
「about_Remote_Requirements」を参照してください。
バックグラウンド ジョブについて
バックグラウンド ジョブは、コマンドまたは式を非同期的に実行します。バックグラウンド ジョブは、
コマンドレット、関数、スクリプト、またはその他のコマンドベースのタスクを実行できます。バックグ
ラウンド ジョブは、時間のかかるコマンドを実行するように設計されていますが、バックグラウンド ジ
ョブを使用すると、どのコマンドもバックグラウンドで実行できます。
同期コマンドが実行されている場合、コマンドが完了するまで、Windows PowerShell のコマンド プロン
プトは表示されません。ただし、バックグラウンド ジョブによって Windows PowerShell プロンプトが
非表示になることはありません。バックグラウンド ジョブを開始するコマンドは、ジョブ オブジェクト
を返します。すぐにプロンプトに戻るため、バックグラウンド ジョブを実行しながら他のタスクを実行
することができます。
ただし、バックグラウンド ジョブを開始すると、ジョブは直ちに実行されますが、その結果はすぐには
得られません。返されるジョブ オブジェクトには、ジョブに関する有用な情報が含まれています。ただ
し、ジョブの結果は含まれません。ジョブの結果を取得するには、別のコマンドを実行する必要がありま
す。また、ジョブの停止、ジョブが完了するまでの待機、およびジョブの削除を行うためのコマンドを実
行することもできます。
バックグラウンド ジョブのタイミングを他のコマンドとは無関係にするために、各バックグラウンド ジ
ョブは、専用の Windows 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 つ以上の子ジョブから構成されています。Start-Job
を使用して、または Invoke-Command の AsJob パラメーターを使用して開始されたジョブでは、親ジョブ
はエグゼクティブになります。この親ジョブはコマンドを実行せず、結果を返しません。コマンドは、実
際には子ジョブによって実行されるためです (他のコマンドレットを使用して開始したジョブでは、異な
る動作になることがあります)。
子ジョブは、親ジョブ オブジェクトの ChildJobs プロパティに保存されます。ChildJobs プロパ
ティには、1 つ以上の子ジョブ オブジェクトを含めることができます。子ジョブ オブジェクトには、親
ジョブとは違う名前、ID、およびインスタンス ID があるため、親ジョブと子ジョブは個々に、または
まとめて管理することができます。
ジョブ内の親ジョブと子ジョブを表示するには、次のコマンドに示すように、Get-Job コマンドレット
を使用して親ジョブを取得し、次にこのジョブをパイプを介して Format-List コマンドに渡します。こ
れにより、オブジェクトの Name プロパティおよび ChildJobs プロパティが表示されます。
C:\PS> get-job | format-list -property Name, ChildJobs
Name : Job1
ChildJobs : {Job2}
次のコマンドに示すように、子ジョブに Get-Job コマンドを使用することもできます。
C:\PS> get-job job2
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
2 Job2 Completed True localhost get-process
子ジョブの構成は、ジョブの開始に使用するコマンドによって異なります。
-- ローカル コンピューターで Start-Job を使用してジョブを開始する場合、ジョブは、エグゼ
クティブである親ジョブと、コマンドを実行する子ジョブから構成されます。
-- 1 台以上のコンピューターで Invoke-Command の AsJob パラメーターを使用してジョブを開始
する場合、ジョブは、コンピューターごとに実行されるジョブごとに、エグゼクティブである親ジ
ョブと子ジョブから構成されます。
-- 1 台以上のリモート コンピューターで Invoke-Command を使用して Start-Job コマンド
を実行する場合、結果は、各リモート コンピューターでローカル コマンドを実行した場合と同じ
になります。このコマンドは、コンピューターごとにジョブ オブジェクトを返します。ジョブ オ
ブジェクトは、エグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブから構成されます。
親ジョブは、すべての子ジョブを表しています。親ジョブを管理すると、関連する子ジョブも管理すること
になります。たとえば、親ジョブを停止すると、すべての子ジョブも停止します。親ジョブの結果を取得すると、
すべての子ジョブの結果も取得されます。
ただし、子ジョブは個々に管理することもできます。この方法が最も便利なのは、ジョブに関する問題を
調べる場合、または Invoke-Command の AsJob パラメーターを使用して開始した多くの子ジョブのうち
1 つのみの結果を取得する場合です (バッククォート文字 (`) は連結文字です)。
次のコマンドは、Invoke-Command の AsJob パラメーターを使用して、ローカル コンピューターおよび
2 台のリモート コンピューターでバックグラウンド ジョブを開始します。このコマンドは、ジョブを $j
変数に保存します。
C:\PS> $j = invoke-command -computername localhost, Server01, Server02 `
-command {get-date} -AsJob
$j 内のジョブの Name プロパティおよび ChildJob プロパティを表示すると、コマンドによってコ
ンピューターごとに、ジョブ オブジェクトと 3 つの子ジョブが返されたことが示されます。
C:\PS> $j | format-list name, childjobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
親ジョブを表示すると、ジョブが失敗したことが示されます。
C:\PS> $j
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job3 Failed True localhost,server... get-date
ただし、子ジョブごとに Get-Job コマンドを実行すると、1 つの子ジョブのみが失敗したことが示され
ます。
PS C:\ps-test> get-job job4, job5, job6
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
4 Job4 Completed True localhost get-date
5 Job5 Failed False Server01 get-date
6 Job6 Completed True Server02 get-date
すべての子ジョブの結果を取得するには、Receive-Job コマンドレットを使用して親ジョブの結果を取
得します。ただし、次のコマンドに示すように、特定の子ジョブの結果を取得することもできます。
C:\PS> receive-job -job6 -keep | format-table ComputerName, DateTime -auto
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
Windows PowerShell バックグラウンド ジョブの子ジョブの機能によって、実行するジョブをさらに
詳細に制御することができます。
関連項目
about_Jobs
about_Remote_Jobs
about_Remote
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
New-PSSession
Enter-PSSession
Exit-PSSession