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, este é o aplicativo de console. No entanto, você pode redirecionar a saída para um arquivo de texto e você pode 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 cmdlet, que envia a
Out-File
saída do comando para um arquivo de texto. Normalmente, você usa oOut-File
cmdlet quando precisa usar seus parâmetros, como oEncoding
,Force
,Width
ouNoClobber
parâmetros.Use o cmdlet, que envia a
Tee-Object
saída do comando para um arquivo de texto e, em seguida, o envia para o pipeline.Use os operadores de redirecionamento do PowerShell. Redirecionar a saída de um comando do PowerShell (cmdlet, função, script) usando o operador de redirecionamento (
>
) é funcionalmente equivalente à tubulação paraOut-File
sem parâmetros extras. O PowerShell 7.4 alterou o comportamento do operador de redirecionamento quando usado para redirecionar o fluxo stdout de um comando nativo.
Para obter mais informações sobre fluxos, consulte about_Output_Streams.
Fluxos de saída redirecionáveis
O PowerShell oferece suporte ao redirecionamento dos seguintes fluxos de saída.
Riacho # | Descrição | Introduzido no | Cmdlet de gravação |
---|---|---|---|
1 | Fluxo de sucesso | PowerShell 2.0 | Write-Output |
2 | Fluxo de erros | PowerShell 2.0 | Write-Error |
3 | Fluxo de Aviso | PowerShell 3.0 | Write-Warning |
4 | Fluxo detalhado | PowerShell 3.0 | Write-Verbose |
5 | Fluxo de depuração | PowerShell 3.0 | Write-Debug |
6 | Fluxo de informações | PowerShell 5.0 | Write-Information , Write-Host |
* | Todos os Streams | PowerShell 3.0 |
Há também um fluxo de progresso no PowerShell, mas ele não oferece suporte ao redirecionamento.
Importante
Os fluxos Success e Error são semelhantes aos fluxos stdout e stderr de outros shells. No entanto, o 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, onde n
representa o número do fluxo. O fluxo de êxito ( 1
) será o padrão se nenhum fluxo for especificado.
Operador | Descrição | Sintaxe |
---|---|---|
> |
Enviar fluxo especificado para um arquivo. | n> |
>> |
Acrescentar fluxo especificado a um arquivo. | n>> |
>&1 |
Redireciona o fluxo especificado para o fluxo Êxito . | n>&1 |
Observação
Ao contrário de alguns shells Unix, você só pode redirecionar outros fluxos para o fluxo Success .
Redirecionando a saída de comandos nativos
O PowerShell 7.4 alterou o comportamento dos operadores de redirecionamento quando usados para redirecionar o fluxo stdout de um comando nativo. Os operadores de redirecionamento agora preservam os dados de fluxo de bytes ao redirecionar a saída de um comando nativo. O PowerShell não interpreta os dados redirecionados nem adiciona formatação adicional. Para obter mais informações, consulte o Exemplo #7.
Exemplos
Exemplo 1: Redirecionar erros e saída para um arquivo
Este exemplo é executado dir
em um item bem-sucedido e outro que falha.
dir C:\, fakepath 2>&1 > .\dir.log
Ele usa 2>&1
para redirecionar o fluxo de erros para o fluxo de sucesso e >
para enviar o fluxo de sucesso resultante para um arquivo chamadodir.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 Erros 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 de erro ) para um arquivo chamadoC:\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 host de gravação
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
As 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 afeta o que é gravado no fluxo de $ErrorActionPreference
erros.
$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 como Inquire
.
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
Exemplo 7: Redirecionar dados binários de um comando nativo
A partir do PowerShell 7.4, o PowerShell preserva os dados de fluxo de bytes ao redirecionar o fluxo stdout de um comando nativo para um arquivo ou ao canalizar dados de fluxo de bytes para o fluxo stdin de um comando nativo.
Por exemplo, usando o comando curl
nativo, você pode baixar um arquivo binário e salvá-lo em disco usando o redirecionamento.
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
Você também pode redirecionar os dados de fluxo de bytes para o fluxo stdin de outro comando nativo. O exemplo a seguir baixa um arquivo TAR compactado usando curl
.
Os dados do arquivo baixado são transmitidos ao comando tar
para extrair o conteúdo do arquivo morto.
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
Você também pode redirecionar a saída de fluxo de bytes de um comando do PowerShell para a entrada do comando nativo. Os exemplos a seguir usam Invoke-WebRequest
para baixar o mesmo arquivo TAR do exemplo anterior.
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
Esse recurso não dá suporte a dados de fluxo de bytes ao redirecionar a saída stderr para stdout. Quando você combina os fluxos stderr e stdout, os fluxos combinados são tratados como dados de cadeia de caracteres.
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 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 pode não estar 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 um Out-File
ou os operadores de redirecionamento, 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 a saída da tabela de formato do PowerShell 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 ter que adicionar -Width 2000
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 todo o script também afeta a largura de formatação para os operadores de redirecionamento. Coloque o seguinte comando perto da parte superior do script para definir Out-File:Width
para o script inteiro:
$PSDefaultParameterValues['out-file:width'] = 2000
Aumentar a largura de saída aumentará o consumo de memória ao registrar a saída formatada da tabela. Se você estiver registrando muitos dados tabulares no arquivo e souber que pode sobreviver com uma largura menor, use a largura menor.
Em alguns casos, como Get-Service
a saída, para usar a largura extra, você precisará canalizar a saída antes Format-Table -AutoSize
de enviar para o arquivo.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Para obter mais informações sobre $PSDefaultParameterValues
o , consulte about_Preference_Variables.
Confusão potencial com operadores de comparação
O >
operador não deve ser confundido com o operador de comparação Greater-than (muitas vezes denotado como >
em outras linguagens de programação).
Dependendo dos objetos que estão sendo comparados, a saída usada >
pode parecer correta (porque 36 não é maior que 42).
PS> if (36 > 42) { "true" } else { "false" }
false
No entanto, uma verificação 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
A tentativa de usar a comparação <
inversa (menor que), produz um erro de 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 é a operação necessária, -lt
e -gt
deve ser usada. Para obter mais informações, consulte o operador em about_Comparison_Operators-gt
.
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de