主题
    about_Remote_Jobs

简短说明
    说明如何在远程计算机上运行后台作业。

详细说明
    后台作业是异步运行而不与当前会话交互的命令。命令提示符会立即返回,您可以在作业运行的同时继续使用会话。

    默认情况下,后台作业在本地计算机上运行。但是,您可以使用多个不同过程在远程计算机上运行后台作业。

    本主题说明如何在远程计算机上运行后台作业。有关如何在本地计算机上运行后台作业的信息,请参阅 
    about_Jobs。有关后台作业的详细信息,请参阅 about_Job_Details。


 远程后台作业

    可以使用三种不同方法在远程计算机上运行后台作业。

    -- 启动与远程计算机的交互式会话,并在交互式会话中启动作业。虽然所有操作都在远程计算机上执行,但这些过
       程和运行本地作业是相同的。

    -- 在远程计算机上运行将作业结果返回到本地计算机的远程作业。当您希望在本地计算机上的一个中心位置收集和
       维护后台作业的结果时,请使用此方法。

    -- 在远程计算机上运行在远程计算机上维护作业结果的后台作业。当您希望在源计算机上更加安全地维护作业数据
       时,请使用此方法。

 在交互式会话中启动后台作业

    可以启动与远程计算机的交互式会话,然后在进行该交互式会话的过程中启动后台作业。有关交互式会话的详细信
    息,请参阅 about_Remote 和 Enter-PSSession。

    在交互式会话中启动后台作业的过程与在本地计算机上启动后台作业的过程几乎相同。
    但是,所有的操作都在远程计算机上执行,而不是在本地计算机上执行。


    步骤 1:ENTER-PSSESSION

    使用 Enter-PSSession cmdlet 启动与远程计算机的交互式会话。可以使用 Enter-PSSession 的 
    ComputerName 参数为交互式会话建立临时连接。也可以使用 Session 参数在 Windows PowerShell 会话 
    (PSSession) 中运行交互式会话。

    以下命令在 Server01 计算机上启动交互式会话。
  
        C:\PS> Enter-PSSession -computername Server01

    命令提示符会更改以表明现在已连接到 Server01 计算机。

        Server01\C:>


    步骤 2:START-JOB

    若要在会话中启动后台作业,请使用 Start-Job cmdlet。

    以下命令运行获取 Server01 计算机上 Windows PowerShell 事件日志中的事件的后台作业。Start-Job 
    cmdlet 返回一个表示该作业的对象。

    此命令将作业对象保存在 $job 变量中。

        Server01\C:> $job = start-job -scriptblock {get-eventlog 
        "Windows PowerShell"}
   
    当作业运行时,可以使用交互式会话运行其他命令,包括其他后台作业。但是,
    在作业完成之前,必须使交互式会话保持打开状态。如果终止会话,作业将被中断,结果也会丢失。



    步骤 3:GET-JOB

    若要了解作业是否完成,请显示 $job 变量的值,或使用 Get-Job cmdlet 获取作业。以下命令使用 Get-Job 
    cmdlet 显示作业。

        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 cmdlet。可以在交互式会话中显示结果,也可以将结果保存到远程
    计算机上的文件中。下面的命令在 $job 变量中获取作业的结果。该命令使用重定向运算符 (>) 将作业结果保存到 
    Server01 计算机上的 PsLog.txt 文件中。

        Server01\C:> receive-job $job > c:\logs\PsLog.txt



    步骤 5:EXIT-PSSESSION

    若要终止交互式会话,请使用 Exit-PSSession cmdlet。命令提示符会更改以表明您返回到本地计算机上的原始
    会话中。

        Server01\C:> Exit-PSSession
        C:\PS>
         


    步骤 6:INVOKE-COMMAND: GET CONTENT
     
    若要随时查看 Server01 计算机上的 PsLog.txt 文件的内容,请启动另一个交互式会话或运行远程命令。如果
    您希望使用多个命令来调查和管理 PsLog.txt 文件中的数据,则此种类型的命令在 PSSession(持续性连接)中
    运行最好。有关 PSSession 的详细信息,请参阅 about_PSSessions。

    以下命令使用 New-PSSession cmdlet 创建连接到 Server01 计算机的 PSSession,并使用 Invoke-
    Command cmdlet 在 PSSession 中运行 Get-Content 命令以查看文件内容。

        C:\PS> $s = new-pssession -computername Server01
        C:\PS> invoke-command -session $s -scriptblock {get-content c:\logs\pslog.txt}


       
 启动将结果返回到本地计算机的远程作业 (ASJOB)

    若要在远程计算机上启动将命令结果返回到本地计算机的远程作业,请使用相应 cmdlet(例如 Invoke-Command 
    cmdlet)的 AsJob 参数。

    使用 AsJob 参数时,即使作业在远程计算机上运行,作业对象实际上也是在本地计算机上创建。作业完成后,结果
    将返回到本地计算机。

    可以使用包含名词 Job 的 cmdlet (Job cmdlet) 管理由任何 cmdlet 创建的任何作业。很多具有 AsJob 
    参数的 cmdlet 并不使用 Windows PowerShell 远程处理,因此即使在没有配置远程处理和没有达到远程处理
    要求的计算机上,也可以使用这些 cmdlet。
 

    步骤 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 cmdlet 的 AsJob 参数启动的作业,请使用 Job cmdlet。由于表示远程作
    业的作业对象位于本地计算机上,因此无需运行远程命令来管理该作业。

    若要确定该作业是否完成,请使用 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 cmdlet。由于作业结果会自动返回到作业对象驻留的计算机,因此可
    以使用本地 Receive-Job 命令获取结果。

    下面的命令使用 Receive-Job cmdlet 获取作业结果。它使用会话 ID 来标识该作业。此命令将作业结果保存在 
    $results 变量中。您也可以将结果重定向到某个文件。

       $results = receive-job -id 1
    


 启动将结果保存在远程计算机上的远程作业

    若要在远程计算机上启动将命令结果保存在远程计算机上的后台作业,请使用 Invoke-Command cmdlet 在远程
    计算机上运行 Start-Job 命令。可以使用此方法在多台计算机上运行后台作业。

    远程运行 Start-Job 命令时,作业对象在远程计算机上创建,作业结果也在远程计算机上维护。
    从作业的角度来看,所有操作都是本地的。您只是在远程运行命令以在远程计算机上管理本地作业。


    步骤 1:INVOKE-COMMAND START-JOB

    请使用 Invoke-Command cmdlet 在远程计算机上运行 Start-Job 命令。

    此命令需要 PSSession(持续性连接)。如果使用 Invoke-Command 的 ComputerName 参数建立临时连接,
    则在返回作业对象时 Invoke-Command 命令将被视为完成。因此,临时连接将被关闭,作业也会被取消。
 
    以下命令使用 New-PSSession cmdlet 创建一个连接到 Server01 计算机的 PSSession。该命令将 
    PSSession 保存在 $s 变量中。

        $s = new-pssession -computername Server01


    下一个命令使用 Invoke-Command cmdlet 在 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 cmdlet。由于作业对象位于远程计算机上,因此需要运行远程命令以获取、
    停止、等待或检索作业结果。

    若要查看作业是否完成,请使用 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 cmdlet 在连接到 Server01 计算机的 PSSession 中运行 
    Receive-Job 命令。

    下面的命令使用 Receive-Job cmdlet 获取作业结果。它使用会话 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




目录