about_Remote_Output

主题
    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。

    这些 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
    Invoke-Command
    Get-Process
    Get-Service
    Get-WmiObject
    Get-Event
    Format-Table
    Select-Object
    Out-GridView