Este post foi actualizado mais recentemente a 7 de Dezembro de 2020.
4 min. lido.
De vez em quando, depara-se com uma situação, em que precisará de alguma forma de descarregar a saída da consola (ou transcrição) da execução de uma aplicação de consola. Na verdade, vou argumentar que isto acontece muito mais vezes do que se pensa – no meu caso, sempre que um cliente requer um trabalho ou uma função na Web, que normalmente se destacaria para o Azure, sendo executado nos servidores do cliente. Este post descreve como fazer isso.
Problema
Table of Contents
Partida de alguma coisa ou o app crashes, e o erro é registado no registo de eventos… Mas apenas o erro, não toda a transcrição. Gostaria de obter tudo, de descobrir o que realmente se passa, mas o registo de eventos não é o caminho a seguir.
Or, talvez esteja a investigar um erro que aconteceu a outra pessoa, mas apenas obtenha capturas de ecrã de erros de consola ou de registo de eventos, enquanto que em vez disso gostaria de obter toda a informação possível sobre o problema.
O que fazer?
Solução: operador de redireccionamento > para o salvamento!
É, felizmente, bastante fácil. Há várias maneiras de canalizar, despejar, redireccionar, registar, espelhar ou apenas guardar a saída para quase qualquer meio alvo imaginável, mas uma vez que odeio sempre procurar no Google por eles (e pela minha vida, não consigo lembrar-me de cor), estou a documentar aqui a minha maneira preferida.
Não é necessário canalizar a saída para ficheiro – porque o redireccionamento faz nativamente o que se poderia fazer com um cano e “Out-File -FilePath” ou comando semelhante.
Como redireccionar a saída para ficheiro em Powershell?
Pode direccionar toda a saída da consola (e portanto toda a transcrição PowerShell para o seu executável) para um ficheiro de texto fazendo algo do género:
executable.exe > output.txt 2>&1
OR
executable.exe *>&> output.txt
Este método apenas escreve tudo desde a janela da consola até um ficheiro – tão simples quanto isso!
E claro, não se limita apenas ao Pronto Comando (cmd.exe) – também funciona no Windows PowerShell:
se quiser verificar este trabalho, pode executar o seguinte no PowerShell – primeiro sai “Hello World” e depois simplesmente redirecciona-o para a saída do ficheiro.txt:
echo “Hello World” >output.txt 2>&1.\i>p>O segundo comando deve abrir output.txt no editor de texto – e deve conter “Hello World”.
Nestes exemplos, os seguintes parâmetros afectam o resultado:
Element | Description |
Operador de redirecção: > | Escreve o comando de saída para um ficheiro ou dispositivo, como uma impressora, em vez da janela de Prompt de Comando. |
2>&1 | Estes parâmetros fazem com que este comando primeiro redireccione stdout (Standard Output Stream) para o ficheiro de saída, e depois redireccione stderr (Standard Error Stream) para lá também. |
Okay – por isso agora está finalmente documentado. Talvez não tenha de procurar no Google da próxima vez 🙂
Espera… Mas como é que isto é melhor do que copiar a partir de uma janela de consola?
Se não estiver a executar a sua aplicação sem supervisão, pode simplesmente executar a aplicação e copiar-colar da janela para o local da sua preferência. Isso é agradável e fácil! Então o que torna este método melhor?
Um par de coisas que lhe vêm à cabeça:
Porque é que a saída da consola para um ficheiro é melhor do que apenas copipasting
- Pode obter as transcrições sem supervisão. Não tem de fazer nada sozinho.
- Desta forma, não vai estragar a cópia seleccionando de áreas da saída.
- li>Não sei quanto a si, mas muitas vezes estrago a cópia colada a partir de uma consola ou janela PowerShell. Este método torna isso impossível.
- Esta é a forma mais fácil que encontrei de pedir a outras pessoas toda a saída/transcrição de uma aplicação de consola executada.
- Isso é realmente útil, porque quando estou a depurar, quero realmente todo o registo, e não apenas as últimas linhas de texto vermelho!
Mais pensamentos
Para mais informações e opções sobre os cenários de saída, ver este tópico Stack Overflow. Se quiser ler mais sobre stdout e stderr, veja isto.
E para mais referências, aqui está uma lista de todos os operadores de redireccionamento suportados para versões razoavelmente recentes da PowerShell (provavelmente válida para PowerShell >5.1):
Redirecção | |
---|---|
>> | Enviar saída para o ficheiro especificado |
Aplica a saída ao conteúdo do ficheiro especificado | |
2> | Enviar erros para o ficheiro especificado. |
2>> | Aplica os erros ao conteúdo do ficheiro especificado file |
2>&1 | Enviar erros e resultados de sucesso para a fluxo de saída de successo |
3> | Enviar avisos para o ficheiro especificado |
3>> | Aplica avisos ao conteúdo do ficheiro especificado. |
3>&1 | Enviar avisos e saída de sucesso para o fluxo de saída de sucesso |
4> | Enviar saída verbosa para o ficheiro especificado |
4>> | Aplicações saída verbosa para o conteúdo de o ficheiro especificado |
4>&1 | Enviar saída verbosa e sucesso de saída para o fluxo de saída de sucesso |
5> | Enviar mensagens de depuração para o ficheiro especificado |
5>> | Aplica mensagens de depuração ao conteúdo de o ficheiro especificado |
5>&1 | Enviar mensagens de depuração e saída de sucesso para o fluxo de saída de sucesso |
6> | Enviar informações mensagens para um especificado file |
6>> | Aplica mensagens informativas ao contentes de um ficheiro especificado |
6>&1 | Enviar mensagens informativas e sucesso output para o fluxo de saída de sucesso. |
*> | Enviar todos os tipos de saída para o ficheiro especificado |
**>> | Aplica todos os tipos de saída ao conteúdo de o ficheiro especificado |
**>&1 | Enviar todos os tipos de saída para a saída de sucesso stream |
No entanto, um cenário muito mais avançado seria salvar a saída directamente para Application Insights ou algo semelhante. Para muitos casos, isto seria como disparar uma mosca com uma bazuca, mas para implantações maiores, porque não? Talvez valha a pena um post no blog mais tarde!
- Autor
- Posts recentes
Ele é desenvolvedor desde 2004 (começando com PHP e Java), e tem dobrado e torcido SharePoint em diferentes formas desde MOSS. Hoje em dia ele não só está a trabalhar no SharePoint, mas também em projectos .NET, Azure, Office 365 e muitas outras coisas. Ele também é o Microsoft MVP para o desenvolvimento do Office.
Este é o seu blog pessoal profissional (por exemplo, profissional, mas definitivamente pessoal).
- Guia: Como tomar conta e matar um inquilino AAD viral? – 24 de Março de 2021
- Como listar todas as assembleias carregadas numa sessão PowerShell? – 18 de Março de 2021
- Of Course I Still #ValoLove You – 15 de Março, 2021
/div>