I'estou a tentar redireccionar toda a saída (stdout + stderr) de um comando DOS para um único ficheiro:
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 redireccionar para dois ficheiros separados?
O senhor quer:
dir > a.txt 2>&1
A sintaxe 2>&1
irá redireccionar 2
(stderr) para 1
(stdout). Também se podem esconder mensagens redireccionando para NUL
, mais explicações e exemplos em MSDN.
A resposta de Anders Lindahl's está correcta, mas é de notar que se estiver a redireccionar stdout para um ficheiro e quiser redireccionar também stderr então DEVE assegurar-se de que 2>&1
é especificado AMBÉM o 1>
redireccionar, caso contrário não funcionará.
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
Embora a resposta aceita para esta pergunta esteja correta, ela realmente não'não faz muito para explicar por que funciona, e como a sintaxe não é imediatamente clara eu fiz um rápido google para descobrir o que realmente estava acontecendo. Na esperança de que esta informação seja útil para os outros, eu'estou postando aqui.
Extraído de [MS Support KB 110930][1].
Redirecionando Mensagens de Erro do Prompt de Comando:
STDERR/STDOUT
Sumário
Ao redirecionar a saída de uma aplicação usando o '>' as mensagens de erro ainda são impressas na tela. Isto é porque as mensagens de erro são frequentemente enviadas para o fluxo de erro padrão ao invés do fluxo de saída padrão.
A saída de um aplicativo ou comando de console (Command Prompt) é frequentemente enviada para dois fluxos separados. A saída regular é enviada para Standard Out (STDOUT) e as mensagens de erro são enviadas para Standard Error (STDERR). Quando você redireciona a saída do console usando o "">" você está apenas redirecionando STDOUT. Para redirecionar STDERR você tem que especificar '2>' para o símbolo de redirecionamento. Isto selecciona o segundo fluxo de saída que é STDERR.
Exemplo
O comando
dir file.xxx
(ondefile.xxx
não existe) irá exibir a seguinte saída:
Volume na unidade F é Candy Cane Volume Serial Number é 34EC-0876
Arquivo não encontrado
Se você redirecionar a saída para o dispositivo
NUL
utilizandodir file.xxx > nul
, você ainda verá a parte da mensagem de erro da saída, assim:
Arquivo Não Encontrado
Para redirecionar (apenas) a mensagem de erro para
NUL
, utilize o seguinte comando:
dir file.xxx 2> nul
Ou, você pode redirecionar 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 "&1" para redirecionar a saída para STDERR para STDOUT e depois enviar a saída de STDOUT para um arquivo:
dir file.xxx 1> output.msg 2>&1
Para adicionar a stdout e stderr ao arquivo de log geral de um script:
dir >> a.txt 2>&1
Correto, o tratamento de arquivo 1 para o processo é STDOUT, redirecionado por 1>
ou por >
(1 pode ser omitido, por convenção, o interpretador de comando [cmd.exe] sabe lidar com isso).
O file handle 2 é STDERR, redirecionado por 2>
.
Note que se você're utiliza estes para fazer arquivos de log, então a menos que você're envie a saída para arquivos de log _uniquelynamed (ex. data e hora carimbados), então se você executar o mesmo processo duas vezes, o redirecionado irá sobrescrever (substituir) o arquivo de log anterior.
O >>
(tanto para STDOUT como para STDERR) não REPRODUZIRÁ o ficheiro.
Assim você obtém um arquivo de log cumulativo, mostrando os resultados de todas as execuções do processo - tipicamente mais útil.
Trilhas Felizes...
Acabei de cortar a resposta como @Anders acabou de a afixar, mas...
A partir da minha ajuda Windows, pesquisei no redireccionamento (URL ms-its:C:\WINDOWS\Help\ntcmds.chm::/redirection.htm).
Talvez queira ler sobre >> e | (tubo), também.
No entanto, não há garantia de que a saída de SDTOUT
e STDERR
sejam entrelaçadas linha a linha, em ordem oportuna, utilizando a sintaxe de redirecionamento POSIX
.
Se uma aplicação utiliza saída em buffer, pode acontecer que o texto de um fluxo 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 (isto é
o "StdOut/StdErr Logger"
by 'LoRd MuldeR'
) pode ser mais confiável para tal tarefa.
Veja: [MuldeR's OpenSource Projects][1]
Em um arquivo de lote (Windows 7 e superior) eu 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 que quiser e a saída será direcionada para o arquivo de texto. Usando este método é confiável COMO NÃO há saída na tela.