Como redirecionar a saída de um PowerShell para um arquivo durante sua execução

198

Eu tenho um script do PowerShell para o qual gostaria de redirecionar a saída para um arquivo. O problema é que não consigo mudar a maneira como esse script é chamado. Então eu não posso fazer:

 .\MyScript.ps1 > output.txt

Como redireciono a saída de um script do PowerShell durante sua execução?

Martin
fonte

Respostas:

192

Talvez Start-Transcript funcione para você. Primeiro, pare-o se já estiver em execução, depois inicie-o e pare-o quando terminar.

$ ErrorActionPreference = "SilentlyContinue"
Transcrição Stop | nulo
$ ErrorActionPreference = "Continuar"
Iniciar-Transcrição -caminho C: \ output.txt -append
# Faça algumas coisas
Stop-Transcript

Você também pode executá-lo enquanto trabalha nas coisas e salvar suas sessões de linha de comando para referência posterior.

Se você deseja suprimir completamente o erro ao tentar parar uma transcrição que não está transcrevendo, faça o seguinte:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"
Bratch
fonte
13
Observe que start-transcript não registra apenas saída padrão de Write-Error, Write-Verbose ou Write-Debug ...
21971 Richard Berg
6
@richard: parece fazê-lo agora. Talvez seja uma adição 2.0, não tenho certeza se todas essas respostas se aplicam à 1.0.
Robert S Ciaccio
Estou usando quase o mesmo código acima. meu problema é que, Stop-Transcript | out-null, ainda envia saída de erro se a transcrição não for iniciada. Preciso suprimir a mensagem, pois ela bagunça meu layout. -erroractioncontinue silenciosamente também não ajuda. alguma ideia?
Mel
4
Por fim, encontrei os documentos para Start-Transcript . (frustrantemente não identificado com o número da versão do Powershell). Ele diz "A transcrição inclui todos os comandos que o usuário digita e toda a saída que aparece no console". No entanto, testei o Start-Transcript no Powershell 2.0 e descobri que @Richard está certo, o erro padrão não é salvo na transcrição. Isso é péssimo!
Coronel Panic
Este método não parece avisá-lo se você realmente tem permissão para gravar no local especificado.
Demongolem 14/09/16
51

A Microsoft anunciou no site do Connections da Powershell (15/02/2012 às 16:40) que na versão 3.0 eles estenderam o redirecionamento como uma solução para esse problema.

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

Consulte o artigo de ajuda "about_Redirection" para obter detalhes e exemplos.

help about_Redirection
Nathan Hartley
fonte
1
Não estou dizendo que gosto desta solução. Na verdade, acho feio, difícil de lembrar e inflexível. Parece que adicionar parâmetros de captura de fluxo aos cmdlets Out- *, Set-Content e Add-Content teria feito o truque de uma maneira mais eficiente. Enquanto eles estão nisso, eles também devem adicionar um parâmetro -PassThru. O que efetivamente tornaria obsoleto o Cmdlet Tee-Object menos que útil.
Nathan Hartley
Estou confuso, como isso responde à pergunta que está sendo feita? "Como redireciono a saída de um script do PowerShell durante sua execução?"
Zoredache
Você está certo, @Zoredache, parece que eu negligenciei o requisito "não é possível mudar a maneira como esse script é chamado". Ao capturar a maioria da saída, Start-Transcript é o caminho a percorrer. Devo remover esta resposta?
Nathan Hartley
1
Para aqueles que vêm aqui para redirecionamento geral, o Powershell adicionou -OutVariable -WarningVariable -ErrorVariable, que responde diretamente ao meu comentário de 3 de janeiro de 14.
Nathan Hartley
2
Não, está bem deixar isso. Dado o número de votos positivos, é obviamente útil. Essa pergunta quase certamente está recebendo hits do Google de pessoas capazes de mudar a maneira como o script está sendo chamado.
Zoredache
36

Usar:

Write "Stuff to write" | Out-File Outputfile.txt -Append
Fred
fonte
2
não resolve a pergunta do OP porque não funciona "durante a execução". Mas dei +1 porque é útil saber como canalizar no Powershell de qualquer maneira.
Paul Masri-Stone
28

Presumo que você pode modificar MyScript.ps1. Em seguida, tente alterá-lo da seguinte maneira:

$(
    Here is your current script
) *>&1 > output.txt

Eu apenas tentei isso com o PowerShell 3. Você pode usar todas as opções de redirecionamento, como na resposta de Nathan Hartley .

mplwork
fonte
Eu gosto desta solução. Você pode usar >> output.txt para anexar. Alguém sabe se existe uma maneira de fazer isso criar ascii em vez de unicode?
Prof Von Lemongargle 10/10
1
Você pode tentar algo assim: *>&1 | Out-File $log -Encoding ascii -Append -Width 132mas o Powershell é realmente feio se você precisar controlar com precisão a saída.
Mplwork # 12/16
Eu prefiro isso, pois funciona dentro do seu script. Perfeito para vagabundos.
User3505901
25

Uma solução possível, se sua situação permitir:

  1. Renomeie MyScript.ps1 para TheRealMyScript.ps1
  2. Crie um novo MyScript.ps1 parecido com:

    . \ TheRealMyScript.ps1> output.txt

zdan
fonte
18
powershell ".\MyScript.ps1" > test.log
suiwenfeng
fonte
1
Essa foi a única das muitas opções que funcionaram para a minha saída de script.
Cori #
17

Você pode dar uma olhada no Tee-Object do cmdlet . Você pode canalizar a saída para o Tee e ele gravará no pipeline e também em um arquivo

Andy Schneider
fonte
1
"saída" | Set-Content -PassThru e "output" | Add-Content -PassThru também funcionará como Tee-Object, com o benefício adicional de que você pode definir a Codificação.
Nathan Hartley
16

Se você deseja um redirecionamento direto de toda a saída para um arquivo, tente usar *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

Como esse é um redirecionamento direto para o arquivo, ele não será exibido no console (geralmente útil). Se você deseja a saída do console, combine toda a saída com *&>1e, em seguida, canalize com Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

Acredito que essas técnicas sejam suportadas no PowerShell 3.0 ou posterior; Estou testando no PowerShell 5.0.

sonjz
fonte
4

Se você deseja fazê-lo na linha de comando e não incorporado no próprio script, use:

.\myscript.ps1 | Out-File c:\output.csv
Chris
fonte
7
O solicitante está explicitamente explicando que a chamada de script não pode ser alterada.
Fer
3
Não relacionado à pergunta, mas útil para mim, eu estava pesquisando no Google para obter a sintaxe correta com o Pipe to Out-File.
gReX 23/02
0

Para incorporar isso ao seu script, você pode fazer o seguinte:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

Isso deve fazer o truque.

bbcompent1
fonte