Redirecione o cmd stdout e stderr do Windows para um único arquivo

688

Estou tentando redirecionar 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 redirecionar para dois arquivos separados?

ripper234
fonte
14
TechNet: Usando operadores de redirecionamento de comando (responde melhor que qualquer uma das respostas aqui).
Martin Prikryl
1
2> & 1, uma vez que não pode reabrir o mesmo arquivo
Lucas

Respostas:

1090

Você quer:

dir > a.txt 2>&1

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

Anders Lindahl
fonte
32
obrigado por isso, não sabia que essa sintaxe do shell unix também funciona para o DOS!
chaindriver 14/08/12
20
isso é ótimo para esconder toda a saída .. net stop w3svc >NUL 2>&1.. obrigado!
amigos estão dizendo sobre wasatchwizard
3
@wasatchwizard Eu acho que tive problemas com isso, mas> NUL 2> NUL funcionou bem
FrinkTheBrave
13
Se houver um identificador, não poderá haver um espaço entre o identificador (ou seja, 2) e o operador de redirecionamento (ou seja>). Portanto, 2> 2.txtfunciona (ou 2> &1) 2 > 2.txtnão; 2 > &1não.
The Red Pea
9
Eu amo tanto. "Ugh, esse pequeno problema pontual vai demorar uma hora". Levei mais tempo para digitar este comentário do que para encontrar esta resposta.
Brandon
195

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

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
DelboyJay
fonte
10
Depois é o que me custou horas para descobrir o que há de errado DelboyJay! Obrigado!
Nam G VU
4
É explicado em algum lugar por que colocar 2> & 1 antes de 1> não alcançou o efeito pretendido? Eu suspeito fortemente que isso tenha a ver com a maneira como "cmd" analisa comandos que fornecem dois significados diferentes, dependendo da ordem em que você especifica o redirecionamento. Mas as regras semânticas estão documentadas em qualquer lugar, porque acho que vale a pena aprender isso, pois pode perder horas.
21914 iglgotiz
12
@igbgotiz 2> & 1 significa 'redirecionar o fluxo 2 para o fluxo 1'. Então, você precisa configurar o fluxo 1 primeiro
FrinkTheBrave 4/14
3
@FrinkTheBrave, mas o fluxo 1 é a saída padrão (por exemplo, console) se não for especificado explicitamente. Isso ainda não explica imho.
MarioDS 3/11
1
@MDeSchaepmeester, se o fizer dir 2>&1 > a.txt, você primeiro redirecionará ( >) o fluxo 2 (stderr) para o fluxo 1 (stdout). Depois que os dois já estiverem juntos, você estará redirecionando o stdout ( >sem nenhum especificador) para o arquivo. Se você deseja que o stderr vá para outro lugar, você não pode associá-lo ao stdout primeiro.
cp.engr
80

Informações básicas de MSKB

Embora a resposta aceita para esta pergunta esteja correta, ela realmente não ajuda muito a explicar por que funciona, e como a sintaxe não está clara imediatamente, fiz um rápido google para descobrir o que realmente estava acontecendo. Na esperança de que essas informações sejam úteis para outras pessoas, estou postando aqui.

Retirado do suporte da Microsoft KB 110930 .


From MSKB110930

Redirecionando mensagens de erro do prompt de comando: STDERR / STDOUT

Sumário

Ao redirecionar a saída de um aplicativo usando o símbolo '>', as mensagens de erro ainda são impressas na tela. Isso ocorre porque as mensagens de erro geralmente são enviadas para o fluxo de erro padrão em vez do fluxo de saída padrão.

A saída de um aplicativo ou comando do console (prompt de comando) geralmente é enviada para dois fluxos separados. A saída regular é enviada para Saída Padrão (STDOUT) e as mensagens de erro são enviadas para Erro Padrão (STDERR). Ao redirecionar a saída do console usando o símbolo ">", você está redirecionando apenas o STDOUT. Para redirecionar o STDERR, você deve especificar '2>' para o símbolo de redirecionamento. Isso seleciona o segundo fluxo de saída que é STDERR.

Exemplo

O comando dir file.xxx(onde file.xxxnã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ê redirecionar a saída para o NULdispositivo usando dir file.xxx > nul, ainda verá a mensagem de erro como parte da saída, assim:

File Not Found

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

dir file.xxx 2> nul

Ou, você pode redirecionar a saída para um local 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 redirecionar a saída de STDERR para STDOUT e enviando a saída de STDOUT para um arquivo:

dir file.xxx 1> output.msg 2>&1
StormeHawke
fonte
29

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

dir >> a.txt 2>&1
Henk Wiersema
fonte
9
A >>anexa ao arquivo onde o >sobrescreve o arquivo.
precisa saber é o seguinte
13

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

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

O >>(para STDOUT ou STDERR) APPEND não substituirá o arquivo. Assim, você obtém um arquivo de log cumulativo, mostrando os resultados de todas as execuções do processo - geralmente mais úteis.

Trilhas felizes...

Max Vitesse
fonte
2

No entanto, não há garantia de que a saída SDTOUTe a STDERRentrelaçamento sejam entrelaçadas linha a linha em tempo hábil, usando a POSIXsintaxe de mesclagem de redirecionamento.

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

Um registrador de saída do console dedicado (ou seja, o "StdOut/StdErr Logger"by 'LoRd MuldeR') pode ser mais confiável para essa tarefa.

Veja: Projetos OpenSource do MuldeR

LigH
fonte
0

Em um arquivo em lotes (Windows 7 e superior), achei este método mais confiável

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Obviamente, use os comandos desejados e a saída será direcionada para o arquivo de texto. O uso desse método é confiável, NO entanto, NÃO há saída na tela.

PanamaPHat
fonte
(basicamente a mesma resposta dada algumas vezes atrás.) Você pode forçar a saída para a tela com >con echo This goes to screenTambém útil para entrada do usuário >con set /p "var="Input: "Nota: essas linhas aparecerão apenas na tela e não serão redirecionadas para o arquivo.
Stephan Stephan