TÓPICO about_Remote_Output DESCRIÇÃO RESUMIDA Descreve como interpretar e formatar a saída dos comandos remotos. DESCRIÇÃO LONGA A saída de um comando que foi executado em um computador remoto possivelmente se assemelhará à saída do mesmo comando executado em um computador local, mas com algumas diferenças. Este tópico explica como interpretar, formatar e exibir a saída dos comandos executados nos computadores remotos. EXIBINDO O NOME DO COMPUTADOR Quando você usar o cmdlet Invoke-Command para executar um comando em um computador remoto, o comando retornará um objeto que inclui o nome do computador que gerou os dados. O computador remoto é armazenado na propriedade PSComputerName. Para muitos comandos, o PSComputerName é exibido por padrão. Por exemplo, o comando a seguir executa um comando Get-Culture em dois computadores remotos, Server01 e Server02. A saída, que aparece abaixo, inclui os nomes dos computadores remotos em que o comando foi executado. 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 Você pode usar o parâmetro HideComputerName de Invoke-Command para ocultar a propriedade PSComputerName. Esse parâmetro foi projetado para comandos que coletam dados apenas de um computador remoto. O comando a seguir executa um comando Get-Culture no computador remoto Server01. Ele usa o parâmetro HideComputerName para ocultar a propriedade PSComputerName e as propriedades relacionadas. C:\PS> invoke-command -scr {get-culture} -comp Server01 -HideComputerName LCID Name DisplayName ---- ---- ----------- 1033 en-US English (United States) Você também poderá exibir a propriedade PSComputerName se ela não for exibida por padrão. Por exemplo, os comandos a seguir usam o cmdlet Format-Table para adicionar a propriedade PSComputerName à saída de um 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 -------- -------------- Segunda-feira, 21 de julho de 2008 19:16:58 Server01 Segunda-feira, 21 de julho de 2008 19:16:58 Server02 EXIBINDO A PROPRIEDADE MACHINENAME Vários cmdlets, incluindo Get-Process, Get-Service e Get-EventLog, têm um parâmetro ComputerName que permite a obtenção de objetos em um computador remoto. Esses cmdlets não usam a comunicação remota do Windows PowerShell, portanto, você pode usá-los até mesmo em computadores que não estejam configurados para comunicação remota no Windows PowerShell. Os objetos retornados por esses cmdlets armazenam o nome do computador remoto na propriedade MachineName. (Esses objetos não têm uma propriedade PSComputerName.) Por exemplo, esse comando obtém o processo do PowerShell nos computadores remotos Server01 e Server02. A exibição padrão não inclui a propriedade 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 Você pode usar o cmdlet Format-Table para exibir a propriedade MachineName dos objetos de processo. Por exemplo, o comando a seguir salva os processos na variável $p e usa um operador de pipeline (|) para enviar os processos de $p ao comando Format-Table. O comando usa o parâmetro Property de Format-Table para incluir a propriedade MachineName na exibição. 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 O comando mais complexo seguinte adiciona a propriedade MachineName à exibição padrão do processo. Usa tabelas de hash para especificar as propriedades calculadas. Felizmente, você não precisa entendê-las para utilizá-las. (Observe que a crase (`) é o caractere de continuação.) 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 DESSERIALIZADOS Quando você executar comandos remotos que geram saída, a saída do comando será transmitida pela rede ao computador local. Como a maioria dos objetos ao vivo do Microsoft .NET Framework (como os objetos retornados pelos cmdlets do Windows PowerShell) não pode ser transmitida pela rede, os objetos ao vivo são "serializados". Em outras palavras, os objetos ao vivo são convertidos em representações XML do objeto e de suas respectivas propriedades. Em seguida, o objeto serializado baseado em XML será transmitido pela rede. No computador local, o Windows PowerShell recebe o objeto serializado baseado em XML e "desserializa-o", convertendo-o em um objeto de .NET Framework padrão. No entanto, o objeto desserializado não é um objeto ao vivo. É um instantâneo do objeto no momento em que ele foi serializado, que inclui propriedades mas nenhum método. Você pode usar e gerenciar esses objetos no Windows PowerShell, inclusive transmiti-los em pipelines, exibir as propriedades selecionadas e formatá-los. A maioria dos objetos desserializados é formatada automaticamente para ser exibida por entradas nos arquivos Types.ps1xml ou Format.ps1xml. No entanto, o computador local possivelmente não terá arquivos de formatação para todos os objetos desserializados gerados em um computador remoto. Quando os objetos não são formatados, todas as propriedades de cada objeto aparecem no console em uma lista contínua. Quando os objetos não forem formatados automaticamente, você poderá usar os cmdlets de formatação, como Format-Table ou Format-List, para formatar e exibir as propriedades selecionadas. Você pode usar o cmdlet Out-GridView para exibir os objetos em uma tabela. Além disso, se você executar um comando em um computador remoto que use cmdlets que você não tenha em seu computador local, os objetos retornados pelo comando possivelmente não serão formatados corretamente porque você não tem os arquivos de formatação desses objetos em seu computador. Para obter dados de formatação de outro computador, use os cmdlets Get-FormatData e Export-FormatData. Alguns tipos de objeto, como DirectoryInfo e GUIDs, são convertidos novamente em objetos ao vivo quando são recebidos. Esses objetos não precisam de nenhum tratamento ou formatação especial. ORDENANDO OS RESULTADOS A ordem dos nomes de computador no parâmetro ComputerName dos cmdlets determina a ordem em que o Windows PowerShell se conecta aos computadores remotos. No entanto, os resultados aparecem na ordem em que o computador local os recebe, que pode ser uma ordem diferente. Para alterar a ordem dos resultados, use o cmdlet Sort-Object. Você pode fazer a classificação com base na propriedade PSComputerName ou MachineName. Você também fazê-la com base em outra propriedade do objeto, para que os resultados de computadores diferentes sejam intercalados. CONSULTE TAMBÉM about_Remote Format-Table Get-EventLog Get-Process Get-Service Get-WmiObject Invoke-Command Out-GridView Select-Object