about_Remote_Jobs

应用到: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

主题

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(持续连接)中运行。有关 PSSessions 的详细信息,请参阅 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 远程处理,因此你甚至可以在未针对远程处理进行配置和不符合远程处理要求的计算机上使用它们。

步骤 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 命令获取作业。

请注意,Location 属性的值显示该作业已在本地计算机(称为“LocalHost”)上运行,即使该作业曾在 Server01 计算机上运行也是如此。由于该作业对象在 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

about_Remote_Variables

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

New-PSSession

Enter-PSSession

Exit-PSSession