トピック 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: 内容の取得 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