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?
windows
command-line
cmd
pipe
ripper234
fonte
fonte
Respostas:
Você quer:
A sintaxe
2>&1
será redirecionada2
(stderr) para1
(stdout). Você também pode ocultar mensagens redirecionando paraNUL
, mais explicações e exemplos no MSDN .fonte
net stop w3svc >NUL 2>&1
.. obrigado!2> 2.txt
funciona (ou2> &1
)2 > 2.txt
não;2 > &1
não.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>&1
seja especificado APÓS o1>
redirecionamento, caso contrário não funcionará.fonte
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.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
fonte
Para adicionar o stdout e o stderr ao arquivo de log geral de um script:
fonte
>>
anexa ao arquivo onde o>
sobrescreve o arquivo.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 por2>
.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...
fonte
No entanto, não há garantia de que a saída
SDTOUT
e aSTDERR
entrelaçamento sejam entrelaçadas linha a linha em tempo hábil, usando aPOSIX
sintaxe 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
fonte
Em um arquivo em lotes (Windows 7 e superior), achei este método mais confiável
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.
fonte
>con echo This goes to screen
També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.