TEMA
about_Remote_Output
DESCRIPCIÓN BREVE
Describe cómo interpretar y dar formato a los resultados de
comandos remotos.
DESCRIPCIÓN DETALLADA
El resultado de un comando ejecutado en un equipo remoto podría
parecer similar al resultado del mismo comando ejecutado en un
equipo local, pero hay algunas diferencias significativas.
En este tema se explica cómo interpretar, dar formato y mostrar
los resultados de los comandos ejecutados en equipos remotos.
MOSTRAR EL NOMBRE DEL EQUIPO
Cuando se usa el cmdlet Invoke-Command para ejecutar un comando
en un equipo remoto, el comando devuelve un objeto que incluye el
nombre del equipo que generó los datos. El nombre del equipo
remoto se almacena en la propiedad PSComputerName.
Para muchos comandos, la propiedad PSComputerName se muestra de
forma predeterminada. Por ejemplo, el comando siguiente ejecuta
un comando Get-Culture en dos equipos remotos, Servidor01 y
Servidor02. El resultado, que aparece a continuación, incluye los
nombres de los equipos remotos en los que se ejecutó el comando.
C:\PS> invoke-command -script {get-culture} -comp Servidor01, Servidor02
LCID Name DisplayName PSComputerName
---- ---- ----------- --------------
1033 en-US Inglés (Estados Unidos) Server01
1033 es-AR Español (Argentina) Server02
Puede utilizar el parámetro HideComputerName de Invoke-Command
para ocultar la propiedad PSComputerName. Este parámetro se ha
diseñado para los comandos que recopilan datos de solo un equipo
remoto.
El comando siguiente ejecuta un comando Get-Culture en el equipo
remoto Servidor01. Utiliza el parámetro HideComputerName para
ocultar la propiedad PSComputerName y las propiedades relacionadas.
C:\PS> invoke-command -scr {get-culture} -comp Servidor01 -HideComputerName
LCID Name DisplayName
---- ---- -----------
1033 en-US Inglés (Estados Unidos)
Asimismo, puede mostrar la propiedad PSComputerName si no
aparece de forma predeterminada.
Por ejemplo, los comandos siguientes utilizan el cmdlet
Format-Table para agregar la propiedad PSComputerName al
resultado de un comando Get-Date remoto.
C:\PS> $dates = invoke-command -script {get-date} -computername Servidor01, Servidor02
C:\PS> $dates | format-table DateTime, PSComputerName -auto
DateTime PSComputerName
-------- --------------
Lunes, 21 de julio de 2008 19:16:58 Servidor01
Lunes, 21 de julio de 2008 19:16:58 Servidor02
MOSTRAR LA PROPIEDAD MACHINENAME
Varios cmdlets, como Get-Process, Get-Service y Get-EventLog,
tienen un parámetro ComputerName que obtiene los objetos de un
equipo remoto.
Estos cmdlets no utilizan la comunicación remota de Windows
PowerShell, por lo que puede usarlos en los equipos que no estén
configurados para la comunicación remota de Windows PowerShell.
Los objetos que estos cmdlets devuelven almacenan el nombre del
equipo remoto en la propiedad MachineName. (Estos objetos no
tienen la propiedad PSComputerName.)
Por ejemplo, este comando obtiene el proceso de PowerShell en los
equipos remotos Servidor01 y Servidor02. De forma predeterminada,
no se muestra la propiedad MachineName.
C:\PS> get-process powershell -computername servidor01, servidor02
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
Puede utilizar el cmdlet Format-Table para mostrar la propiedad
MachineName de los objetos de proceso.
Por ejemplo, el comando siguiente guarda los procesos en la
variable $p y, a continuación, utiliza un operador de
canalización (|) para enviar los procesos guardados en $p al
comando Format-Table. El comando utiliza el parámetro Property de
Format-Table para que se muestre la propiedad MachineName.
C:\PS> $p = get-process powershell -comp Servidor01, Servidor02
C:\PS> $P | format-table -property ID, ProcessName, MachineName -auto
Id ProcessName MachineName
-- ----------- -----------
2648 powershell Servidor02
3020 powershell Servidor01
4796 powershell Servidor02
El siguiente comando, que es más complejo, agrega la propiedad
MachineName a la presentación predeterminada de los procesos.
Utiliza tablas hash para especificar las propiedades calculadas.
Afortunadamente, no es preciso que lo entienda para poder usarlo.
(Observe que el carácter de acento grave [`] es el carácter de
continuación.)
C:\PS> $p = get-process powershell -comp Servidor01, Servidor02
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 Servidor02
192 6 24132 32028 140 3020 powershell Servidor01
438 26 48436 59132 565 4796 powershell Servidor02
OBJETOS DESERIALIZADOS
Cuando se ejecutan comandos remotos que generan resultados,
dichos resultados se transmiten al equipo local a través de la red.
Dado que la mayoría de los objetos activos de Microsoft .NET
Framework (como los objetos devueltos por los cmdlets de Windows
PowerShell) no se pueden transmitir a través de la red, se
"serializan" dichos objetos. En otras palabras, los objetos
activos se convierten en representaciones XML del objeto y sus
propiedades. A continuación, el objeto serializado basado en XML
se transmite a través de la red.
En el equipo local, Windows PowerShell recibe el objeto
serializado basado en XML y lo "deserializa" convirtiéndolo en un
objeto estándar de .NET Framework.
Sin embargo, el objeto deserializado no es un objeto activo. Es
una instantánea del objeto en el momento en que se serializó e
incluye propiedades pero no incluye ningún método. Puede utilizar
y administrar estos objetos en Windows PowerShell, incluso puede
pasarlos a través de canalizaciones, mostrar determinadas
propiedades y darles formato.
A la mayoría de los objetos deserializados se les aplica
automáticamente formato mediante entradas de los archivos
Types.ps1xml o Format.ps1xml. Sin embargo, puede que el equipo
local no tenga archivos de formato para todos los objetos
deserializados generados en un equipo remoto. Cuando no se da
formato a los objetos, todas las propiedades de cada objeto
aparecen en la consola como una lista continua.
Cuando no se da formato automáticamente a los objetos, puede
utilizar los cmdlets de formato, como Format-Table o Format-List,
para dar formato y mostrar determinadas propiedades. O bien,
puede usar el cmdlet Out-GridView para mostrar los objetos en una
tabla.
Asimismo, si ejecuta un comando en un equipo remoto que utiliza
cmdlets que no existen en el equipo local, puede que no se
aplique un formato correcto a los objetos devueltos por el
comando dado que su equipo no dispone de los archivos de formato
para esos objetos. Para obtener datos de formato de otro equipo,
utilice los cmdlets Get-FormatData y Export-FormatData.
Algunos tipos de objeto, como objetos DirectoryInfo y GUID, se
convierten de nuevo en objetos activos en el momento de
recibirlos. Estos objetos no necesitan ningún tratamiento o
formato especial.
ORDENAR LOS RESULTADOS
El orden de los nombres de equipo en el parámetro ComputerName de
los cmdlets determina el orden en que Windows PowerShell se
conecta a los equipos remotos. Sin embargo, los resultados
aparecen en el orden en que el equipo local los recibe, el cual
podría ser diferente.
Para cambiar el orden de los resultados, utilice el cmdlet
Sort-Object. Puede ordenar por la propiedad PSComputerName o
MachineName. También puede ordenar por otra propiedad del objeto
de modo que se intercalen los resultados de los diferentes equipos.
VEA TAMBIÉN
about_Remote
Format-Table
Get-EventLog
Get-Process
Get-Service
Get-WmiObject
Invoke-Command
Out-GridView
Select-Object