about_Remote_Output

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

主题

about_Remote_Output

简短说明

介绍如何解释远程命令的输出和设置其格式。

详细说明

在远程计算机上运行的命令的输出可能与在本地计算机上运行的命令的输出类似,但存在一些明显区别。

本主题说明如何解释和显示在远程计算机上运行的命令的输出,以及如何设置其格式。

显示计算机名称

当使用 Invoke-Command cmdlet 在远程计算机上运行命令时,该命令将返回包含生成数据的计算机名称的对象。远程计算机名称存储在 PSComputerName 属性中。

对于多数命令,默认情况下将显示 PSComputerName。例如,以下命令将在 Server01 和 Server02 这两台远程计算机上运行 Get-Culture 命令。下面显示的输出包括在其上运行命令的远程计算机的名称。

        C:\PS> invoke-command -script {get-culture} -comp Server01, Server02

        LCID  Name    DisplayName                PSComputerName
        ----  ----    -----------                --------------
        1033  en-US   English (United States)    Server01
        1033  es-AR   Spanish (Argentina)        Server02

Invoke-Command 的 HideComputerName 参数可用于隐藏 PSComputerName 属性。此参数专用于只从一台远程计算机中收集数据的命令。

以下命令在 Server01 远程计算机上运行 Get-Culture 命令。它使用 HideComputerName 参数隐藏 PSComputerName 属性和相关属性。

        C:\PS> invoke-command -scr {get-culture} -comp Server01 -HideComputerName

        LCID             Name             DisplayName
        ----             ----             -----------
        1033             en-US            English (United States)

还可以在默认不显示 PSComputerName 属性时显示它。

例如,以下命令使用 Format-Table cmdlet 将 PSComputerName 属性添加到远程 Get-Date 命令的输出。

        C:\PS> $dates = invoke-command -script {get-date} -computername Server01, Server02
        C:\PS> $dates | format-table DateTime, PSComputerName -auto

        DateTime                            PSComputerName
        --------                            --------------
        Monday, July 21, 2008 7:16:58 PM    Server01
        Monday, July 21, 2008 7:16:58 PM    Server02      

显示 MACHINENAME 属性

多个 cmdlet(包括 Get-Process、Get-Service 和 Get-EventLog)具有可在远程计算机上获取对象的 ComputerName 参数。这些 cmdlet 不使用 Windows PowerShell® 远程处理,因此甚至在 Windows PowerShell 中未配置用于远程处理的计算机上也可以使用它们。

这些 cmdlet 返回的对象将远程计算机的名称存储在 MachineName 属性中。(这些对象没有 PSComputerName 属性。)

例如,此命令将在 Server01 和 Server02 远程计算机上获取 PowerShell 进程。默认显示内容不包括 MachineName 属性。

        C:\PS> get-process PowerShell -computername server01, server02


        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            920      38    97524     114504   575     9.66   2648 PowerShell
            194       6    24256      32384   142            3020 PowerShell
            352      27    63472      63520   577     3.84   4796 PowerShell

Format-Table cmdlet 可用于显示进程对象的 MachineName 属性。

例如,以下命令将进程保存在 $p 变量中,然后使用管道运算符 (|) 将 $p 中的进程发送给 Format-Table 命令。该命令使用 Format-Table 的 Property 参数将 MachineName 属性包含在显示内容中。

        C:\PS> $p = get-process PowerShell -comp Server01, Server02
        C:\PS> $P | format-table -property ID, ProcessName, MachineName -auto


        Id ProcessName MachineName
        -- ----------- -----------
        2648 PowerShell  Server02
        3020 PowerShell  Server01
        4796 PowerShell  Server02

以下更复杂的命令将 MachineName 属性添加到默认进程显示。它使用哈希表来指定计算的属性。幸运的是,无需了解即可使用它。

(请注意,反引号 [`] 是连续字符。)

        C:\PS> $p = get-process PowerShell -comp Server01, Server02

        C:\PS> $p | format-table -property Handles, `
                    @{Label="NPM(K)";Expression={[int]($_.NPM/1024)}}, `
                    @{Label="PM(K)";Expression={[int]($_.PM/1024)}}, `
                    @{Label="WS(K)";Expression={[int]($_.WS/1024)}}, `
                    @{Label="VM(M)";Expression={[int]($_.VM/1MB)}}, `
                    @{Label="CPU(s)";Expression={if ($_.CPU -ne $()){ $_.CPU.ToString("N")}}}, `
                    Id, ProcessName, MachineName -auto
       

        Handles NPM(K) PM(K)  WS(K) VM(M) CPU(s)   Id ProcessName MachineName
        ------- ------ -----  ----- ----- ------   -- ----------- -----------
            920     38 97560 114532   576        2648 PowerShell  Server02     
            192      6 24132  32028   140        3020 PowerShell  Server01   
            438     26 48436  59132   565        4796 PowerShell  Server02   

反序列化的对象

当运行可生成输出的远程命令时,将该命令输出通过网络传输回本地计算机。

由于大多数活动 Microsoft.NET Framework 对象(如 Windows PowerShell cmdlet 返回的对象)不能通过网络传输,因此将对这些活动对象进行“序列化”。换言之,将这些活动对象转换为该对象的 XML 表示形式及其属性。然后,通过网络传输基于 XML 的序列化的对象。

在本地计算机上, Windows PowerShell 接收基于 XML 的序列化的对象,并通过将基于 XML 的对象转换为标准的 .NET Framework 对象对其进行“反序列化”。

但是,反序列化的对象不是活动对象。它是该对象在已完成序列化时的快照,并且它包含属性,但不包含方法。可以在 Windows PowerShell 中使用并管理这些对象,包括在管道中传递它们、显示所选的属性和设置其格式。

对大多数反序列化的对象自动设置格式,以按 Types.ps1xml 或 Format.ps1xml 文件中的条目进行显示。但是,针对在远程计算机上生成的所有反序列化的对象,本地计算机可能没有格式设置文件。当未设置对象的格式时,每个对象的所有属性将以流式传输列表的形式出现在控制台中。

当未自动设置对象的格式时,可以使用格式设置 cmdlet(如 Format-Table 或 Format-List)对所选属性进行设置格式并显示它们。或者,可以使用 Out-GridView cmdlet 在表中显示这些对象。

此外,如果在远程计算机(该计算机使用在你的本地计算机上不存在的 cmdlet)上运行某个命令,可能无法正确设置该命令返回的对象的格式,因为在你的计算机上没有适用于这些对象的格式设置文件。若要从另一台计算机上获取格式设置数据,请使用 Get-FormatData 和 Export-FormatData cmdlet。

收到某些对象类型(如 DirectoryInfo 对象和 GUID)时,将它们转换回活动对象。无需对这些对象进行任何特殊处理或格式设置。

对结果进行排序

Cmdlet 的 ComputerName 参数中的计算机名称的顺序可确定 Windows PowerShell 连接到远程计算机所使用的顺序。但是,以本地计算机接收结果的顺序显示这些结果时,这可能是不同的顺序。

若要更改结果的顺序,请使用 Sort-Object cmdlet。可以使用 PSComputerName 或 MachineName 属性进行排序。还可以使用对象的另一个属性进行排序,以便散置来自不同计算机的结果。

另请参阅

about_Remote

about_Remote_Variables

Format-Table

Get-EventLog

Get-Process

Get-Service

Get-WmiObject

Invoke-Command

Out-GridView

Select-Object