Compartilhar via


about_Redirection

Descrição breve

Explica como redirecionar a saída do PowerShell para arquivos de texto.

Descrição longa

Por padrão, o PowerShell envia a saída para o host do PowerShell. Normalmente, esse é o aplicativo de console. No entanto, você pode redirecionar a saída para um arquivo de texto e redirecionar a saída de erro para o fluxo de saída regular.

Você pode usar os seguintes métodos para redirecionar a saída:

  • Use o Out-File cmdlet , que envia a saída do comando para um arquivo de texto. Normalmente, você usa o Out-File cmdlet quando precisa usar seus parâmetros, como os Encodingparâmetros , Force, Widthou NoClobber .

  • Use o Tee-Object cmdlet , que envia a saída do comando para um arquivo de texto e, em seguida, envia-a para o pipeline.

  • Use os operadores de redirecionamento do PowerShell. Usar o operador de redirecionamento com um destino de arquivo é funcionalmente equivalente à canalização para Out-File sem parâmetros extras.

Para obter mais informações sobre fluxos, consulte about_Output_Streams.

Fluxos de saída redirecionáveis

O PowerShell dá suporte ao redirecionamento dos fluxos de saída a seguir.

Stream # Descrição Introduzido no Cmdlet de gravação
1 Êxito Stream PowerShell 2.0 Write-Output
2 Erro Stream PowerShell 2.0 Write-Error
3 Stream de aviso PowerShell 3.0 Write-Warning
4 Stream detalhados PowerShell 3.0 Write-Verbose
5 Depurar Stream PowerShell 3.0 Write-Debug
6 Stream de informações PowerShell 5.0 Write-Information, Write-Host
* Todos os Fluxos PowerShell 3.0

Também há um fluxo de progresso no PowerShell, mas ele não dá suporte ao redirecionamento.

Importante

Os fluxos de êxito e erro são semelhantes aos fluxos stdout e stderr de outros shells. No entanto, stdin não está conectado ao pipeline do PowerShell para entrada.

Operadores de redirecionamento do PowerShell

Os operadores de redirecionamento do PowerShell são os seguintes, em que n representa o número do fluxo. O fluxo de êxito ( 1 ) será o padrão se nenhum fluxo for especificado.

Operador Descrição Syntax
> Enviar o fluxo especificado para um arquivo. n>
>> Acrescente o fluxo especificado a um arquivo. n>>
>&1 Redireciona o fluxo especificado para o fluxo de êxito . n>&1

Observação

Ao contrário de alguns shells do Unix, você só pode redirecionar outros fluxos para o fluxo de Sucesso .

Exemplos

Exemplo 1: redirecionar erros e saída para um arquivo

Este exemplo é executado dir em um item que é bem-sucedido e um que falha.

dir C:\, fakepath 2>&1 > .\dir.log

Ele usa 2>&1 para redirecionar o fluxo De erro para o fluxo de êxito e > para enviar o fluxo de êxito resultante para um arquivo chamado dir.log

Exemplo 2: Enviar todos os dados de fluxo de êxito para um arquivo

Este exemplo envia todos os dados de fluxo de êxito para um arquivo chamado script.log.

.\script.ps1 > script.log

Exemplo 3: enviar fluxos de êxito, aviso e erro para um arquivo

Este exemplo mostra como você pode combinar operadores de redirecionamento para obter um resultado desejado.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1 redireciona o fluxo de aviso para o fluxo de êxito .
  • 2>&1 redireciona o fluxo De erro para o fluxo de êxito (que agora também inclui todos os dados de fluxo de aviso)
  • > redireciona o fluxo de êxito (que agora contém fluxos de Aviso e Erro ) para um arquivo chamado C:\temp\redirection.log.

Exemplo 4: redirecionar todos os fluxos para um arquivo

Este exemplo envia todos os fluxos de saída de um script chamado script.ps1 para um arquivo chamado script.log.

.\script.ps1 *> script.log

Exemplo 5: suprimir todos os dados de fluxo de informações e Write-Host

Este exemplo suprime todos os dados de fluxo de informações. Para ler mais sobre cmdlets de fluxo de informações , consulte Write-Host e Write-Information

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Exemplo 6: Mostrar o efeito das Preferências de Ação

Variáveis e parâmetros de preferência de ação podem alterar o que é gravado em um fluxo específico. O script neste exemplo mostra como o valor de $ErrorActionPreference afeta o que é gravado no fluxo de Erro .

$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
    get-item /not-here 2>&1 >> log.txt
}
catch {
    "`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Continue'

Quando executamos esse script, somos solicitados quando $ErrorActionPreference é definido Inquirecomo .

PS C:\temp> .\test.ps1

Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
  23 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The running command stopped because the user selected the Stop option.

Quando examinamos o arquivo de log, vemos o seguinte:

PS C:\temp> Get-Content .\log.txt
Continue

Get-Item: C:\temp\test.ps1:3
Line |
   3 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find path 'C:\not-here' because it does not exist.

SilentlyContinue
Stop
    Error caught!
Ignore
Inquire

Observações

Os operadores de redirecionamento que não acrescentam dados (> e n>) substituem o conteúdo atual do arquivo especificado sem aviso.

No entanto, se o arquivo for somente leitura, oculto ou arquivo do sistema, o redirecionamento falhará. Os operadores de redirecionamento de acréscimo (>> e n>>) não gravam em um arquivo somente leitura, mas acrescentam conteúdo a um sistema ou arquivo oculto.

Para forçar o redirecionamento de conteúdo para um arquivo somente leitura, oculto ou do sistema, use o Out-File cmdlet com seu Force parâmetro .

Quando você está gravando em arquivos, os operadores de redirecionamento usam UTF8NoBOM codificação. Se o arquivo tiver uma codificação diferente, a saída poderá não ser formatada corretamente. Para gravar em arquivos com uma codificação diferente, use o Out-File cmdlet com seu Encoding parâmetro .

Largura da saída ao gravar em um arquivo

Quando você está gravando em um arquivo usando operadores Out-File de redirecionamento ou , o PowerShell formata a saída da tabela para o arquivo com base na largura do console em que ele está sendo executado. Por exemplo, ao registrar a saída da tabela no arquivo usando um comando como Get-ChildItem Env:\Path > path.log em um sistema em que a largura do console é definida como 80 colunas, a saída no arquivo é truncada para 80 caracteres:

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7;C:\WINDOWS…

Considerando que a largura do console pode ser definida arbitrariamente em sistemas em que o script é executado, você pode preferir que a saída da tabela de formato do PowerShell seja exibida para arquivos com base em uma largura especificada.

O Out-File cmdlet fornece um parâmetro Width que permite definir a largura desejada para a saída da tabela. Em vez de precisar adicionar -Width 2000 em todos os lugares que você invocar Out-File, você pode usar a $PSDefaultParameterValues variável para definir esse valor para todos os usos do Out-File cmdlet em um script. E como os operadores de redirecionamento (> e >>) são efetivamente aliases para Out-File, definir o Out-File:Width parâmetro para o script inteiro também afeta a largura de formatação para os operadores de redirecionamento. Coloque o seguinte comando próximo à parte superior do script para definir Out-File:Width para todo o script:

$PSDefaultParameterValues['out-file:width'] = 2000

Aumentar a largura de saída aumentará o consumo de memória ao registrar a saída formatada na tabela. Se você estiver registrando muitos dados tabulares no arquivo e souber que pode passar com uma largura menor, use a largura menor.

Em alguns casos, como Get-Service saída, para usar a largura extra, você precisará redirecionar a saída antes Format-Table -AutoSize de fazer a saída para o arquivo.

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Para obter mais informações sobre $PSDefaultParameterValues, consulte about_Preference_Variables.

Redirecionamento de dados binários

O PowerShell não dá suporte ao redirecionamento de dados binários. Se você redirecionar dados de fluxo de bytes, o PowerShell tratará os dados como cadeias de caracteres. Esse redirecionamento resulta em dados corrompidos.

Possível confusão com operadores de comparação

O > operador não deve ser confundido com o operador de comparação Maior que (geralmente indicado como > em outras linguagens de programação).

Dependendo dos objetos que estão sendo comparados, a saída usando > pode parecer correta (porque 36 não é maior que 42).

PS> if (36 > 42) { "true" } else { "false" }
false

No entanto, um marcar do sistema de arquivos local pode ver que um arquivo chamado 42 foi gravado, com o conteúdo 36.

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Tentar usar a comparação < inversa (menor que), gera um erro do sistema:

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

Se a comparação numérica for a operação -lt necessária e -gt deverá ser usada. Para obter mais informações, consulte o -gt operador no about_Comparison_Operators.

Confira também