about_Remote_Output
Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
TEMA
about_Remote_Output
DESCRIPCIÓN BREVE
Describe cómo interpretar y dar formato a la salida de los comandos remotos.
DESCRIPCIÓN LARGA
La salida de un comando ejecutado en un equipo remoto podría parecerse a la salida del mismo comando ejecutado en un equipo local, pero hay algunas diferencias importantes.
En este tema se explica cómo interpretar, dar formato y mostrar la salida de los comandos que se ejecutan en equipos remotos.
MOSTRAR EL NOMBRE DEL EQUIPO
Al usar 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 de los comandos, la propiedad PSComputerName se muestra de forma predeterminada. Por ejemplo, el siguiente comando ejecuta un comando Get-Culture en dos equipos remotos, Server01 y Server02. La salida, que aparece a continuación, incluye el nombre de los equipos remotos en los que se ejecutó el comando.
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
Puede usar el parámetro HideComputerName de Invoke-Command para ocultar la propiedad PSComputerName. Este parámetro está diseñado para los comandos que recopilan datos desde un único equipo remoto.
El siguiente comando ejecuta un comando Get-Culture en el equipo remoto Server01. Usa el parámetro HideComputerName para ocultar la propiedad PSComputerName y las propiedades relacionadas.
C:\PS> invoke-command -scr {get-culture} -comp Server01 -HideComputerName
LCID Name DisplayName
---- ---- -----------
1033 en-US English (United States)
También puede mostrar la propiedad PSComputerName si no se muestra de forma predeterminada.
Por ejemplo, los siguientes comandos usan el cmdlet Format-Table para agregar la propiedad PSComputerName a la salida de un comando Get-Date remoto.
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
MOSTRAR LA PROPIEDAD MACHINENAME
Hay varios cmdlets (como Get-Process, Get-Service y Get-EventLog) que tienen un parámetro ComputerName que obtiene los objetos en un equipo remoto. Estos cmdlets no usan la comunicación remota de Windows PowerShell®, por lo que puede usarlos incluso en equipos que no estén configurados para usar la comunicación remota en Windows PowerShell.
Los objetos que devuelven estos cmdlets almacenan el nombre del equipo remoto en la propiedad MachineName (estos objetos no tienen ninguna propiedad PSComputerName).
Por ejemplo, este comando obtiene el proceso de PowerShell en los equipos remotos Server01 y Server02. La presentación predeterminada no incluye la propiedad 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
Puede usar el cmdlet Format-Table para mostrar la propiedad MachineName de los objetos del proceso.
Por ejemplo, el siguiente comando guarda los procesos en la variable $p y usa un operador de canalización (|) para enviarlos al comando Format-Table. El comando usa el parámetro Property de Format-Table para incluir la propiedad MachineName en la presentación.
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
El siguiente comando, que es más complejo, agrega la propiedad MachineName a la presentación predeterminada del proceso. Usa tablas hash para especificar las propiedades calculadas. Por suerte, no es necesario comprenderlo para poder usarlo
(tenga en cuenta que el acento grave [`] es el carácter de continuación).
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
OBJETOS DESERIALIZADOS
Al ejecutar comandos remotos que generan una salida, esta se transmite a través de la red hasta llegar al equipo local.
Dado que la mayoría de los objetos activos de Microsoft .NET Framework (como los objetos que devuelven los cmdlets de Windows PowerShell) no se pueden transmitir a través de la red, se "serializan" los objetos activos. Dicho de otra forma, los objetos activos se convierten en representaciones XML del objeto y de 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, sino que es una instantánea del objeto en el momento que se serializó, e incluye propiedades pero no métodos. Puede usar y administrar estos objetos en Windows PowerShell (por ejemplo, pasarlos por las canalizaciones, mostrar las propiedades seleccionadas y darles formato).
Se da formato automáticamente a la mayoría de los objetos deserializados para mostrarlos por entradas en los archivos Types.ps1xml o Format.ps1xml. Sin embargo, es posible que el equipo local no tenga suficientes archivos de formato para todos los objetos deserializados que se generaron en un equipo remoto. Cuando no se da formato a los objetos, aparecen todas sus propiedades en la consola en una lista de transmisión por secuencias.
Cuando no se da formato a los objetos automáticamente, puede usar los cmdlets de formato (como Format-Table o Format-List) para dar formato y mostrar las propiedades seleccionadas. También puede usar el cmdlet Out-GridView para mostrar los objetos en una tabla.
Además, si ejecuta un comando en un equipo remoto que usa cmdlets que no tiene en su equipo local, es posible que no se aplique el formato correcto a los objetos que devuelve el comando porque no dispone en su equipo de los archivos de formato de dichos objetos. Para obtener datos de formato de otro equipo, use los cmdlets Get-FormatData y Export-FormatData.
Algunos tipos de objetos, como los objetos DirectoryInfo y los GUID, al recibirlos se convierten en objetos activos. Estos objetos no necesitan ningún tratamiento o formato especial.
ORDENACIÓN DE LOS RESULTADOS
El orden de los nombres de los equipos en el parámetro ComputerName de los cmdlets determina el orden en el que Windows PowerShell se conecta a los equipos remotos. Sin embargo, los resultados aparecen en el orden en el que los recibe el equipo local, que podría ser distinto.
Use el cmdlet Sort-Object para cambiar el orden de los resultados. Puede ordenarlos por la propiedad PSComputerName o MachineName. También puede ordenar los resultados por otra propiedad del objeto para que se intercalen los resultados de diferentes equipos.
VEA TAMBIÉN
about_Remote
about_Remote_Variables
Format-Table
Get-EventLog
Get-Process
Get-Service
Get-WmiObject
Invoke-Command
Out-GridView
Select-Object