about_Remote_Jobs
適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0
トピック
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 (永続的な接続) で実行することをお勧めします。PSSessions の詳細については、「about_PSSessions」を参照してください。
次のコマンドは、New-PSSession コマンドレットを使用して、Server01 コンピューターに接続する PSSession を作成し、Invoke-Command コマンドレットを使用して、ファイルの内容を表示する Get-Content コマンドを PSSession で実行します。
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 コマンドを使用してジョブを取得できます。
Location プロパティの値は、ジョブが Server01 コンピューターで実行されたにもかかわらず、"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 に関するページ
about_Remote_Variables
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
New-PSSession
Enter-PSSession
Exit-PSSession