Redirecionar o Windows cmd stdout e stderr para um único arquivo

Estou tentando redirect toda a saída (stdout + stderr) de um comando do DOS para um único arquivo:

C:\>dir 1> a.txt 2> a.txt The process cannot access the file because it is being used by another process. 

É possível, ou devo apenas redirect para dois arquivos separados?

Você quer:

 dir > a.txt 2>&1 

A syntax 2>&1 redirectá 2 (stderr) para 1 (stdout). Você também pode ocultar mensagens redirecionando para o NUL , mais explicações e exemplos no MSDN .

A resposta de Anders Lindahl está correta, mas deve-se notar que se você está redirecionando o stdout para um arquivo e quer redirect o stderr também, você DEVE garantir que 2>&1 seja especificado APÓS o redirecionamento 1> , caso contrário ele não funcionará.

 REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT **** dir 2>&1 > a.txt 

Forma correta: dir > a.txt 2>&1 . Para acrescentar, use >> .

Informação de fundo do MSKB

Embora a resposta aceita para essa pergunta esteja correta, realmente não explica muito por que ela funciona, e como a syntax não está clara imediatamente, eu fiz um rápido google para descobrir o que realmente estava acontecendo. Na esperança de que essa informação seja útil para os outros, estou postando aqui.

Retirado do MS Support KB 110930 .


De MSKB110930

Redirecionando Mensagens de Erro do Prompt de Comando: STDERR / STDOUT

Resumo

Ao redirect a saída de um aplicativo usando o símbolo ‘>’, as mensagens de erro ainda são impressas na canvas. Isso ocorre porque as mensagens de erro são geralmente enviadas para o stream de erro padrão, em vez do stream de saída padrão.

A saída de um aplicativo ou comando do console (Prompt de Comando) é geralmente enviada para dois streams separados. A saída regular é enviada para Saída Padrão (STDOUT) e as mensagens de erro são enviadas para o Erro Padrão (STDERR). Quando você redireciona a saída do console usando o símbolo “>”, você está apenas redirecionando o STDOUT. Para redirect STDERR você precisa especificar ‘2>’ para o símbolo de redirecionamento. Isso seleciona o segundo stream de saída que é STDERR.

Exemplo

O comando dir file.xxx (onde file.xxx não existe) exibirá a seguinte saída:

 Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876 File Not Found 

Se você redirect a saída para o dispositivo NUL usando o dir file.xxx > nul , você ainda verá a parte da mensagem de erro da saída, desta forma:

 File Not Found 

Para redirect (apenas) a mensagem de erro para o NUL , use o seguinte comando:

 dir file.xxx 2> nul 

Ou você pode redirect a saída para um lugar e os erros para outro.

 dir file.xxx > output.msg 2> output.err 

Você pode imprimir os erros e a saída padrão em um único arquivo usando o comando “& 1” para redirect a saída de STDERR para STDOUT e, em seguida, enviar a saída de STDOUT para um arquivo:

 dir file.xxx 1> output.msg 2>&1 

Para adicionar o stdout e stderr ao arquivo de log geral de um script:

 dir >> a.txt 2>&1 

Correto, o identificador de arquivo 1 para o processo é STDOUT, redirecionado por 1> ou por > (1 pode ser omitido, por convenção, o interpretador de comandos [cmd.exe] sabe lidar com isso). O identificador de arquivo 2 é STDERR, redirecionado por 2> .

Observe que, se você estiver usando-os para criar arquivos de log, a menos que esteja enviando a saída para os arquivos de log _uniquely_named_ (por exemplo, data e hora), se você executar o mesmo processo duas vezes, o redirecionado irá sobrescrever ( replace) o arquivo de log anterior.

O >> (para STDOUT ou STDERR) irá APENAS NÃO SUBSTITUIR o arquivo. Assim, você obtém um arquivo de log cumulativo, exibindo os resultados de todas as execuções do processo – geralmente mais úteis.

Trilhas felizes…

Eu acabei de cortar a resposta como @Anders acabou de postar, mas …

De minha ajuda do Windows, eu procurei no redirecionamento (URL ms-its: C: \ WINDOWS \ Help \ ntcmds.chm :: / redirection.htm ).

Você pode querer ler sobre >> e | (cano) também.

Não há, no entanto, nenhuma garantia de que a saída de SDTOUT e STDERR sejam entrelaçadas linha por linha em ordem pontual, usando a syntax de mesclagem de redirecionamento POSIX.

Se um aplicativo usa saída em buffer, pode acontecer que o texto de um stream seja inserido no outro em um limite de buffer, que pode aparecer no meio de uma linha de texto.

Um logger de saída de console dedicado (como o “StdOut / StdErr Logger” por “LoRd MuldeR”) pode ser mais confiável para tal tarefa. Veja: Projetos OpenSource da MuldeR