关于远程输出

简短说明

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

详细说明

在远程计算机上运行的命令的输出可能类似于在本地计算机上运行的同一命令的输出,但存在一些显著差异。

本主题说明如何解释、格式化和显示远程计算机上运行的命令的输出。

显示计算机名称

使用 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 命令的输出中。

$dates = invoke-command -script {get-date} -computername Server01, Server02
$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 不使用 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}}, `
@{Label="PM(K)";Expression={int}}, `
@{Label="WS(K)";Expression={int}}, `
@{Label="VM(M)";Expression={int}}, `
@{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对象 (,例如 PowerShell cmdlet 返回) 无法通过网络传输的对象,因此实时对象是“序列化的”。 换句话说,实时对象将转换为对象的 XML 表示形式及其属性。 然后,基于 XML 的序列化对象通过网络传输。

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

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

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

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

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

某些对象类型(如 DirectoryInfo 对象和 GUID)在收到时会转换回实时对象。 这些对象不需要任何特殊处理或格式设置。

对结果进行排序

cmdlet 的 ComputerName 参数中计算机名称的顺序决定了 PowerShell 连接到远程计算机的顺序。 但是,结果以本地计算机接收它们的顺序显示,这可能是不同的顺序。

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

另请参阅

about_Remote

about_Remote_Variables

Format-Table

Get-Process

Get-Service

Invoke-Command

Select-Object