about_Job_Details
適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0
トピック
about_Job_Details
概要
ローカル コンピューターおよびリモート コンピューターのバックグラウンド ジョブの詳細について説明します。
詳細説明
このトピックでは、バックグラウンド ジョブの概念について説明し、Windows PowerShell® におけるバックグラウンド ジョブの動作方法に関する技術情報を提供します。
このトピックは、「about_Jobs」と「about_Remote_Jobs」を補足するトピックです。
バックグラウンド ジョブについて
バックグラウンド ジョブは、コマンドまたは式を非同期的に実行します。コマンドレット、関数、スクリプトなどのコマンドベースのタスクを実行できます。バックグラウンド ジョブは長時間にわたるコマンドを実行するよう設計されていますが、どのコマンドもバックグラウンド ジョブを使用すればバックグラウンドで実行できます。
同期コマンドを実行している場合はコマンドが完了するまで 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 があるため、親ジョブと子ジョブを個別に管理することも、1 つの単位として管理することもできます。
特定のジョブの親ジョブと子ジョブを取得するには、Get-Job コマンドレットの IncludeChildJobs パラメーターを使用します。IncludeChildJob パラメーターは Windows PowerShell 3.0 で導入されました。
C:\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
親ジョブと特定の状態値を持つ子ジョブのみを取得するには、Get-Job コマンドレットの ChildJobState パラメーターを使用します。ChildJobState パラメーターは Windows PowerShell 3.0 で導入されました。
C:\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
Windows PowerShell のすべてのバージョンにあるジョブの子ジョブを取得するには、親ジョブの ChildJob プロパティを使用します。
C:\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 コマンドを使用することもできます。
C:\PS> Get-Job Job3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 Failed False localhost Get-Process
子ジョブの構成は、ジョブの開始に使用するコマンドによって異なります。
ローカル コンピューターで Start-Job を使用してジョブを開始すると、ジョブはエグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブで構成されます。
1 台以上のコンピューターで Invoke-Command の AsJob パラメーターを使用してジョブを開始すると、ジョブは、各コンピューターで実行されるジョブごとに、エグゼクティブ親ジョブと 1 つの子ジョブで構成されます。
1 台以上のリモート コンピューターで Invoke-Command を使用して Start-Job コマンドを実行した場合、結果は、各リモート コンピューターでローカル コマンドを実行した場合と同じになります。コマンドによって各コンピューターにジョブ オブジェクトが返されます。ジョブ オブジェクトは、エグゼクティブ親ジョブと、コマンドを実行する 1 つの子ジョブで構成されます。
親ジョブは、すべての子ジョブを表しています。親ジョブを管理すると、関連する子ジョブも管理することになります。たとえば、親ジョブを停止すると、すべての子ジョブも停止します。親ジョブの結果を取得すると、すべての子ジョブの結果も取得されます。
一方で、子ジョブを個別に管理することもできます。この方法は、ジョブに関する問題を調べる場合や、Invoke-Command の AsJob パラメーターを使用して開始した多くの子ジョブのうち 1 つのみの結果を取得する場合に便利です (バックティック文字 [`] は連結文字です)。
次のコマンドは、Invoke-Command の AsJob パラメーターを使用して、ローカル コンピューターと 2 台のリモート コンピューターでバックグラウンド ジョブを開始します。ジョブは $j 変数に保存されます。
PS C:> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob
$j 内のジョブの Name プロパティと ChildJob プロパティを表示すると、1 つのジョブ オブジェクトと 3 つの子ジョブ (各コンピューターに 1 つずつ) が返されたことが示されます。
CPS C:> $j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
親ジョブを表示すると、ジョブが失敗したことが示されます。
C:\PS> $j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
ところが、子ジョブを取得する Get-Job コマンドを実行すると、1 つの子ジョブのみが失敗したことが示されます。
PS C:\> 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 コマンドレットを使用して親ジョブの結果を取得します。ただし、次のコマンドが示すように、特定の子ジョブの結果を取得することもできます。
C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
Windows PowerShell バックグラウンド ジョブの子ジョブ機能により、実行するジョブを詳細に制御できます。
ジョブの種類
Windows PowerShell は、さまざまなタスクを実行するための多種多様なジョブをサポートしています。Windows PowerShell 3.0 以降では、開発者が Windows PowerShell に新しいジョブの種類を追加する "ジョブ ソース アダプター" を作成して、モジュールにジョブ ソース アダプターを含めることができます。モジュールをインポートすれば、セッションで新しいジョブの種類を使用できます。
たとえば、PSScheduledJob モジュールではスケジュールされたジョブが追加され、PSWorkflow モジュールではワークフロー ジョブが追加されます。
カスタムのジョブの種類は、標準の Windows PowerShell バックグラウンド ジョブとは大きく異なる場合があります。たとえば、スケジュールされたジョブはディスクに保存され、特定のセッションのみに配置されるわけではありません。ワークフロー ジョブは中断と再開が可能です。
カスタム ジョブを管理するために使用するコマンドレットは、ジョブの種類によって異なります。Get-Job や Start-Job など標準のジョブ コマンドレットを使用する場合もあれば、特定の種類のジョブのみを管理する専用コマンドレットが付属する場合もあります。カスタムのジョブの種類の詳細については、ジョブの種類に関するヘルプ トピックを参照してください。
特定のジョブについてジョブの種類を確認するには、Get-Job コマンドレットを使用します。Get-Job は、さまざまなジョブの種類のさまざまなジョブ オブジェクトを返します。Get-Job が返すジョブ オブジェクトの PSJobTypeName プロパティの値を見ると、ジョブの種類がわかります。
Windows PowerShell に付属しているジョブの種類の一覧を次の表に示します。
Job Type Description
-------- -----------
BackgroundJob Started by using the Start-Job cmdlet.
RemoteJob Started by using the AsJob parameter of the
Invoke-Command cmdlet.
PSWorkflowJob Started by using the AsJob parameter of a
workflow.
PSScheduledJob An instance of a scheduled job started by
a job trigger.
CIMJob Started by using the AsJob parameter of
a cmdlet from a CDXML module.
WMIJob Started by using the AsJob parameter of
a cmdlet from a WMI module.
PSEventJob Created by running Register-ObjectEvent
and specifying an action with the Action
parameter.
注記:
Get-Job コマンドレットを使用して特定の種類のジョブを取得する前に、ジョブの種類を追加するモジュールが現在のセッションにインポートされていることを確認してください。インポートされていないと、その種類のジョブは Get-Job で取得されません。
例
次のコマンドを実行すると、ローカルのバックグラウンド ジョブ、リモートのバック グラウンド ジョブ、ワークフロー ジョブ、およびスケジュールされたジョブが作成されます。その後、Get-Job コマンドレットを使用して、ジョブが取得されます。Get-Job では、スケジュールされたジョブが取得されませんが、スケジュールされたジョブの開始されたインスタンスが取得されます。
# Start a background job on the local computer.
PS C:\> Start-Job -Name LocalData {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Running True localhost Get-Process
# Start a background job that runs on a remote computer.
PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
# Create a scheduled job
PS C:\> 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 a workflow.
PS C:\> workflow Test-Workflow {Get-Process}
# Run the workflow as a job.
PS C:\> Test-Workflow -AsJob -JobName TestWFJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 TestWFJob PSWorkflowJob NotStarted True localhost Get-Process
# Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
instances of the scheduled job that are started.
PS C:\> 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
# To get scheduled jobs, use the Get-ScheduledJob cmdlet.
PS C:\> Get-ScheduledJob
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True
関連項目
about_Jobs
about_Remote_Jobs
about_Remote に関するページ
about_Scheduled_Jobs
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
Suspend-Job
Resume-Job
New-PSSession
Enter-PSSession
Exit-PSSession
Register-ScheduledJob
Get-ScheduleJob