O Windows PowerShell oferece vários cmdlets que permitem o controle direto da saída de dados. Esses cmdlets compartilham duas características importantes.

Primeiro, geralmente eles transformam dados em alguma forma de texto. Eles fazem isso porque passam os dados de saída a componentes do sistema que exigem uma entrada de texto. Isso significa que precisam representar os objetos como texto. Portanto, o texto é formatado da maneira como é exibido na janela do console do Windows PowerShell.

Segundo, esses cmdlets utilizam o termo Out porque enviam informações para fora do Windows PowerShell, para algum outro local. O cmdlet Out-Host não é exceção: a exibição da janela do host está fora do Windows PowerShell. Isso é importante porque quando os dados são enviados para fora do Windows PowerShell, na verdade estão sendo removidos. Você pode observar isso se tentar criar um pipeline que pagina dados para a janela do host e então tenta formatá-los como uma lista, como mostrado aqui:

PS> Get-Process | Out-Host -Paging | Format-List

Você pode esperar que o comando exiba páginas de informações de processo em um formato de lista. Em vez disso, ele o exibe no formato de lista tabular padrão:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    101       5     1076       3316    32     0.05   2888 alg
...
    618      18    39348      51108   143   211.20    740 explorer
    257       8     9752      16828    79     3.02   2560 explorer
...
<SPACE> next page; <CR> next line; Q quit
...

O cmdlet Out-Host envia os dados diretamente para o console, de modo que o comando Format-List nunca receba algo para formatar.

A maneira correta de estruturar esse comando é colocar o cmdlet Out-Host no fim do pipeline, como mostrado a seguir. Isso faz com que os dados do processo sejam formatados em uma lista antes de serem paginados e exibidos.

PS> Get-Process | Format-List | Out-Host -Paging


Id      : 2888
Handles : 101
CPU     : 0.046875
Name    : alg
...

Id      : 740
Handles : 612
CPU     : 211.703125
Name    : explorer

Id      : 2560
Handles : 257
CPU     : 3.015625
Name    : explorer
...
<SPACE> next page; <CR> next line; Q quit
...

Isso se aplica a todos os cmdlets Out. Um cmdlet Out sempre deve aparecer no fim do pipeline.

Observação:

Todos os cmdlets Out renderizam a saída como texto, usando a formatação em vigor para a janela do console, inclusive os limites de comprimento de linha.

Paginando a saída do console (Out-Host)

Por padrão, o Windows PowerShell envia dados para a janela do host, exatamente o que o cmdlet Out-Host faz. O principal uso do cmdlet Out-Host é paginar dados como discutimos anteriormente. Por exemplo, o comando a seguir usa Out-Host para paginar a saída do cmdlet Get-Command:

PS> Get-Command | Out-Host -Paging

Você também pode usar a função more para paginar dados. No Windows PowerShell, more é uma função que chama Out-Host -Paging. O comando a seguir demonstra o uso da função more para paginar a saída de Get-Command:

PS> Get-Command | more

Se você incluir um ou mais nomes de arquivo como argumentos da função more, ela lerá os arquivos especificados e paginará seu conteúdo para o host:

PS> more c:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
...

Descartando a saída (Out-Null)

O cmdlet Out-Null foi projetado para o descarte imediato de qualquer entrada recebida. Ele é útil no descarte de dados desnecessários obtidos como efeito colateral da execução de um comando. Quando digita o comando a seguir, você não obtém nada do comando:

PS> Get-Command | Out-Null

O cmdlet Out-Null não descarta saídas de erro. Por exemplo, se você digitar o comando a seguir, uma mensagem será exibida, informando que o Windows PowerShell não reconhece 'Is-NotACommand':

PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operabl
e program, or script file.
At line:1 char:12
+ Get-Command  <<<< Is-NotACommand | Out-Null

Imprimindo dados (Out-Printer)

Você pode imprimir os dados usando o cmdlet Out-Printer. O cmdlet Out-Printer usará sua impressora padrão se você não fornecer um nome de impressora. Você pode usar qualquer impressora baseada no Windows especificando seu nome para exibição. Não há necessidade de qualquer tipo de mapeamento de porta de impressora ou até mesmo de uma impressora física real. Por exemplo, se você tiver instalada a ferramenta Microsoft Office Document Imaging, poderá enviar os dados para um arquivo de imagem digitando:

PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"

Salvando dados (Out-File)

Você pode enviar a saída para um arquivo, em vez da janela do console, usando o cmdlet Out-File. A linha de comando a seguir envia uma lista de processos para o arquivo C:\temp\processlist.txt:

PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt 

Os resultados do uso do cmdlet Out-File talvez não sejam o que você espera caso esteja acostumado ao redirecionamento de saída tradicional. Para entender seu comportamento, você deve conhecer o contexto no qual o cmdlet Out-File opera.

Por padrão, o cmdlet Out-File cria um arquivo Unicode. A longo prazo, esse é o melhor padrão, mas significa que as ferramentas que esperam arquivos ASCII não funcionarão corretamente com o formato de saída padrão. Você pode alterar o formato de saída padrão para ASCII usando o parâmetro Encoding:

PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII

Out-file formata o conteúdo do arquivo para que ele se pareça com a saída do console. Isso faz com que a saída seja truncada como na janela do console na maioria dos casos. Por exemplo, se você executar o comando a seguir:

PS> Get-Command | Out-File -FilePath c:\temp\output.txt

A saída será esta:

CommandType     Name                            Definition                     
-----------     ----                            ----------                     
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
...

Para obter uma saída que não force os ajustes de linha a coincidirem com a largura da tela, você pode usar o parâmetro Width para especificar a largura da linha. Como Width é um parâmetro inteiro de 32 bits, o valor máximo que ele pode ter é 2147483647. Digite o comando a seguir para definir a largura da linha com o seu valor máximo:

Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647

O cmdlet Out-File é mais útil quando você deseja salvar a saída como ela seria exibida no console. Para obter um controle mais refinado sobre o formato da saída, você precisará de ferramentas mais avançadas. Nós as veremos no próximo capítulo, junto com alguns detalhes sobre a manipulação de objetos.




Sumário