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