トピック
    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




目次