about_remote_jobs
トピック
about_Remote_Jobs
簡易説明
リモート コンピューターでバックグラウンド ジョブを実行する方法について説明します。
詳細説明
バックグラウンド ジョブは、現在のセッションと対話することなく非同期的に実行されるコマンドです。すぐにコ
マンド プロンプトに戻り、ジョブが実行されている間も引き続きセッションを使用できます。
既定では、バックグラウンド ジョブはローカル コンピューターで実行されます。ただし、いくつかの方法によっ
てバックグラウンド ジョブをリモート コンピューターで実行することもできます。
ここでは、リモート コンピューターでバックグラウンド ジョブを実行する方法について説明します。ローカル
コンピューターでバックグラウンド ジョブを実行する方法については、「about_Jobs」を参照してください。バ
ックグラウンド ジョブの詳細については、「about_Job_Details」を参照してください。
リモート バックグラウンド ジョブ
バックグラウンド ジョブは、次の 3 とおりの方法でリモート コンピューターで実行できます。
-- リモート コンピューターとの対話型のセッションを開始し、その対話型のセッションでジョブを開始しま
す。この場合の手順はローカル ジョブを実行する場合と同じですが、すべての操作はリモート コンピューター
で行われます。
-- 結果をローカル コンピューターに返すバックグラウンド ジョブをリモート コンピューターで実行します。こ
の方法は、バックグラウンド ジョブの結果を収集し、ローカル コンピューターで一元管理する必要がある場合
に使用します。
-- 結果をリモート コンピューターで保持するバックグラウンド ジョブをリモート コンピューターで実行しま
す。この方法は、ジョブ データを元のコンピューター上でより安全に管理する必要がある場合に使用します。
対話型セッションでのバックグラウンド ジョブの開始
リモート コンピューターとの対話型のセッションを開始し、その対話型のセッションでバックグラウンド ジョブ
を開始できます。対話型のセッションの詳細については、「about_Remote」および「Enter-PSSession」を参
照してください。
バックグラウンド ジョブを対話型のセッションで開始する手順は、バックグラウンド ジョブをローカル コンピ
ューターで開始する手順とほぼ同じです。ただし、操作はすべてローカル コンピューターではなくリモート コン
ピューターで行われます。
手順 1. ENTER-PSSESSION
Enter-PSSession コマンドレットを使用して、リモート コンピューターとの対話型のセッションを開始しま
す。Enter-PSSession の ComputerName パラメーターを使用して、対話型のセッション用の一時接続を確立でき
ます。また、Session パラメーターを使用して、Windows PowerShell セッション (PSSession) で対話型
のセッションを実行することもできます。
次のコマンドを実行すると、Server01 コンピューターで対話型のセッションが開始されます。
C:\PS> Enter-PSSession -computername Server01
コマンド プロンプトが変わり、Server01 コンピューターに接続していることが示されます。
Server01\C:>
手順 2. START-JOB
セッションでバックグラウンド ジョブを開始するには、Start-Job コマンドレットを使用します。
次のコマンドは、Server01 コンピューター上の Windows PowerShell イベント ログのイベントを取得するバックグラ
ウンド ジョブを実行します。Start-Job コマンドレットは、ジョブを表すオブジェクトを返します。
このコマンドは、ジョブ オブジェクトを $job 変数に保存します。
Server01\C:> $job = start-job -scriptblock {get-eventlog
"Windows PowerShell"}
ジョブの実行中、対話型のセッションでは他のコマンドを実行できます (他のバックグラウンド ジョブも含む)。
ただし、ジョブが完了するまで対話型のセッションを開いたままにしておく必要があります。セッションを終了す
ると、ジョブが中断され、結果は返されません。
手順 3. GET-JOB
ジョブが完了しているかどうかを確認するには、$job 変数の値を表示するか、Get-Job コマンドレットを使用し
てジョブを取得します。次のコマンドは Get-Job コマンドレットを使用してジョブを表示します。
Server01\C:> get-job $job
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-eventlog "Windows PowerShell"
Get-Job の出力には、ジョブが "localhost" コンピューターで実行されたことが示されています。これは、ジョブ
が同じコンピューターで開始、実行されたためです (この場合は Server01)。
手順 4. RECEIVE-JOB
ジョブの結果を取得するには、Receive-Job コマンドレットを使用します。結果は、対話型のセッションで表示
することも、リモート コンピューター上のファイルに保存することもできます。次のコマンドは、$job 変数内の
ジョブの結果を取得します。このコマンドはリダイレクト演算子 (>) を使用して、ジョブの結果を Server01 コ
ンピューター上の PsLog.txt ファイルに保存します。
Server01\C:> receive-job $job > c:\logs\PsLog.txt
手順 5. EXIT-PSSESSION
対話型のセッションを終了するには、Exit-PSSession コマンドレットを使用します。コマンド プロンプトが
変わり、ローカル コンピューター上の元のセッションに戻ったことが示されます。
Server01\C:> Exit-PSSession
C:\PS>
手順 6. INVOKE-COMMAND: GET CONTENT
Server01 コンピューター上の PsLog.txt ファイルの内容を表示するには、別の対話型のセッションを開始す
るか、リモート コマンドを実行します。この種類のコマンドは、複数のコマンドを使用して PsLog.txt ファイルの
データを調査および管理する必要がある場合に、PSSession (固定接続) で実行することをお勧めします。PSSession の
詳細については、「about_PSSessions」を参照してください。
次のコマンドは、New-PSSession コマンドレットを使用して、Server01 コンピューターに接続する
PSSession を作成します。また、Invoke-Command コマンドレットを使用し、PSSession で Get-Content
コマンドを実行して、ファイルの内容を表示します。
C:\PS> $s = new-pssession -computername Server01
C:\PS> invoke-command -session $s -scriptblock {get-content c:\logs\pslog.txt}
ローカル コンピューターに結果を返すリモート ジョブの開始 (AsJob)
コマンドの結果をローカル コンピューターに返すバックグラウンド ジョブをリモート コンピューターで開始する
には、Invoke-Command などのコマンドレットの AsJob パラメーターを使用します。
AsJob パラメーターを使用した場合、ジョブはリモート コンピューターで実行されますが、ジョブ オブジェク
トは実際にはローカル コンピューターに作成されます。ジョブが完了すると、結果がローカル コンピューターに
返されます。
Job という名詞を含んだコマンドレット (Job コマンドレット) を使用すると、どのコマンドレットで作成されたジ
ョブでも管理できます。AsJob パラメーターを持つコマンドレットの多くは Windows PowerShell のリモート処理を
使用しないので、リモート処理用に構成されていないコンピューターや、リモート処理の要件を満たしていないコ
ンピューターでもこれらのコマンドレットを使用できます。
手順 1. INVOKE-COMMAND -ASJOB
次のコマンドは、Invoke-Command の AsJob パラメーターを使用して、Server01 コンピューターでバックグラウ
ンド ジョブを開始します。ジョブは、システム ログ内のイベントを取得する Get-Eventlog コマンドを実行しま
す。JobName パラメーターを使用して、表示名をジョブに割り当てることができます。
invoke-command -computername Server01 -scriptblock {get-eventlog system} -asjob
コマンドの結果は次のサンプル出力のような形になります。
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Running True Server01 get-eventlog system
AsJob パラメーターを使用した場合、Invoke-Command は、Start-Job が返すジョブ オブジェクトと同じ種類の
ジョブ オブジェクトを返します。ジョブ オブジェクトを変数に保存することも、Get-Job コマンドを使用してジ
ョブを取得することもできます。
Location プロパティの値は、ジョブが Server01 コンピューターで実行されたことを示しています。この点
に注意してください。
手順 2. GET-JOB
Invoke-Command コマンドレットの AsJob パラメーターを使用して開始したジョブを管理するには、Job コ
マンドレットを使用します。リモート ジョブを表すジョブ オブジェクトはローカル コンピューター上にあるの
で、ジョブを管理するためにリモート コマンドを実行する必要はありません。
ジョブが完了しているかどうかを確認するには、Get-Job コマンドを使用します。次のコマンドを実行すると、
現在のセッションで開始されたすべてのジョブを取得できます。
get-job
リモート ジョブは現在のセッションで開始されたため、ローカル Get-Job コマンドによって取得されます。ジ
ョブ オブジェクトの State プロパティは、コマンドが正常に完了したことを示しています。
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Completed True Server01 get-eventlog system
手順 3. RECEIVE-JOB
ジョブの結果を取得するには、Receive-Job コマンドレットを使用します。ジョブの結果は、ジョブ オブジェ
クトが存在するコンピューターに自動的に返されるので、ローカル Receive-Job コマンドで結果を取得できます。
次のコマンドは、Receive-Job コマンドレットを使用してジョブの結果を取得します。ジョブの識別にはセッシ
ョン ID を使用しています。ジョブの結果は $results 変数に保存されます。結果をファイルにリダイレクトするこ
ともできます。
$results = receive-job -id 1
リモート コンピューターで結果を保持するリモート ジョブの開始
コマンドの結果をリモート コンピューターで保持するバックグラウンド ジョブをリモート コンピューターで開始
するには、Invoke-Command コマンドレットを使用して、Start-Job コマンドをリモート コンピューターで実行
します。この方法を使用すると、バックグラウンド ジョブを複数のコンピューターで実行できます。
Start-Job コマンドをリモートで実行すると、ジョブ オブジェクトがリモート コンピューターに作成され、ジョ
ブの結果がリモート コンピューターで保持されます。
ジョブの側から見ると、操作はすべてローカルで行われます。ローカル ジョブをリモート コンピューターで管理
するために、単にコマンドをリモートで実行することになります。
手順 1. INVOKE-COMMAND START-JOB
Invoke-Command コマンドレットを使用して、Start-Job コマンドをリモート コンピューターで実行しま
す。
このコマンドを使用する場合は、PSSession (固定接続) が必要です。Invoke-Command の ComputerName パラ
メーターを使用して一時接続を確立した場合、ジョブ オブジェクトが返されると、Invoke-Command コマンドが
完了したと見なされます。その結果、一時接続が閉じられ、ジョブが取り消されます。
次のコマンドは、New-PSSession コマンドレットを使用して、Server01 コンピューターに接続される PSSession
を作成します。このコマンドは PSSession を $s 変数に保存します。
$s = new-pssession -computername Server01
次のコマンドは、Invoke-Command コマンドレットを使用して、PSSession で Start-Job コマンドを実行
します。Start-Job コマンドと Get-Eventlog コマンドは中かっこで囲みます。
invoke-command -session $s -scriptblock {start-job
-scriptblock {get-eventlog system}}
結果は次のサンプル出力のような形になります。
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
2 Job2 Running True Localhost get-eventlog system
Start-Job コマンドをリモートで実行すると、Invoke-Command は Start-Job が返すジョブ オブジェクトと
同じ種類のジョブ オブジェクトを返します。ジョブ オブジェクトを変数に保存することも、Get-Job コマンド
を使用してジョブを取得することもできます。
ジョブは Server01 コンピューターで実行されたにもかかわらず、Location プロパティの値は、ジョブがローカル
コンピューター ("LocalHost") で実行されたことを示しています。この点に注意してください。ジョブ オブジェクトは
Server01 コンピューターに作成され、ジョブも同じコンピューターで実行されるので、ローカル バックグラウン
ド ジョブと見なされます。
手順 2. INVOKE-COMMAND GET-JOB
リモート バックグラウンド ジョブを管理するには、Job コマンドレットを使用します。ジョブ オブジェクトは
リモート コンピューター上にあるので、ジョブの取得、停止、待機、結果の取得を行うには、リモート コマンド
を実行する必要があります。
ジョブが完了しているかどうかを確認するには、Invoke-Command コマンドを使用して、Server01 コンピュータ
ーに接続されている PSSession で Get-Job コマンドを実行します。
invoke-command -session $s -scriptblock {get-job}
このコマンドはジョブ オブジェクトを返します。ジョブ オブジェクトの State プロパティは、コマンドが正常に
完了したことを示しています。
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
2 Job2 Completed True LocalHost get-eventlog system
手順 3. INVOKE-COMMAND RECEIVE-JOB
ジョブの結果を取得するには、Invoke-Command コマンドレットを使用して、Server01 コンピューターに接続さ
れている PSSession で Receive-Job コマンドを実行します。
次のコマンドは、Receive-Job コマンドレットを使用してジョブの結果を取得します。ジョブの識別にはセッシ
ョン ID を使用しています。ジョブの結果は $results 変数に保存されます。リモート コンピューターのジョブ
キャッシュに結果を保持するため、Receive-Job の Keep パラメーターを使用しています。
$results = invoke-command -session $s -scriptblock {receive-job -sessionid 2 -keep}
ローカル コンピューターまたはリモート コンピューター上のファイルに結果をリダイレクトすることもできま
す。次のコマンドはリダイレクト演算子を使用して、結果を Server01 コンピューター上のファイルに保存しま
す。
invoke-command -session $s -command {receive-job -sessionid 2 > c:\logs\pslog.txt}
関連項目
about_Jobs
about_Job_Details
about_Remote
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
New-PSSession
Enter-PSSession
Exit-PSSession