Redirecionamento de saída

O PowerShell fornece vários cmdlets que permitem controlar a saída de dados diretamente. Esses cmdlets compartilham duas características importantes.

Primeiro, eles geralmente transformam dados em alguma forma de texto. Eles fazem isso porque produzem os dados para componentes do sistema que exigem entrada de texto. Isso significa que eles precisam representar os objetos como texto. Portanto, o texto é formatado como você o vê na janela do console do PowerShell.

Em segundo lugar, esses cmdlets usam o verbo out do PowerShell porque enviam informações do PowerShell para outro lugar.

Saída da consola

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

Get-Command | Out-Host -Paging

A exibição da janela do host está fora do PowerShell. Isso é importante porque quando os dados são enviados para fora do PowerShell, eles são realmente removidos. Você pode ver isso se tentar criar um pipeline que armazene dados na janela do host e, em seguida, tentar formatá-lo como uma lista, conforme mostrado aqui:

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

Você pode esperar que o comando exiba páginas de informações do processo em formato de lista. Em vez disso, ele exibe a 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 Out-Host cmdlet envia os dados diretamente para o console, para que o Format-List comando nunca receba nada para formatar.

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

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 deve sempre aparecer no final do pipeline.

Nota

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

Descartando saída

O Out-Null cmdlet foi projetado para descartar imediatamente qualquer entrada recebida. Isso é útil para descartar dados desnecessários que você obtém como efeito colateral da execução de um comando. Ao digitar o seguinte comando, você não recebe nada de volta do comando:

Get-Command | Out-Null

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

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

Impressão de dados

Out-Printer só está disponível em plataformas Windows.

Você pode imprimir dados usando o Out-Printer cmdlet. O Out-Printer cmdlet usa 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 mesmo uma impressora física real. Por exemplo, se você tiver as ferramentas de criação de imagens de documentos do Microsoft Office instaladas, poderá enviar os dados para um arquivo de imagem digitando:

Get-Command Get-Command | Out-Printer -Name 'Microsoft Office Document Image Writer'

Guardar dados

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

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

Os resultados do uso do cmdlet podem não ser o esperado se você estiver acostumado com o Out-File redirecionamento de saída tradicional. Para entender seu comportamento, você deve estar ciente do contexto no qual o Out-File cmdlet opera.

No Windows PowerShell 5.1, o Out-File cmdlet cria um arquivo Unicode. Algumas ferramentas, que esperam arquivos ASCII, não funcionam 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 :

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

Out-file Formata o conteúdo do arquivo para se parecer com a saída do console. Isso faz com que a saída seja truncada assim como está em uma janela de console na maioria das circunstâncias. Por exemplo, se você executar o seguinte comando:

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

A saída terá esta aparência:

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 quebras de linha para corresponder à 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 seguinte para definir a largura da linha para esse valor máximo:

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

O Out-File cmdlet é mais útil quando você deseja salvar a saída como ela seria exibida no console.