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