Eu tenho um script em lote que executa uma tarefa e envia a saída para um arquivo de texto. Existe uma maneira de exibir a saída na janela do console também?
Por exemplo:
c:\Windows>dir > windows-dir.txt
Existe uma maneira de dir
exibir a saída na janela do console e colocá-la no arquivo de texto?
windows
batch-file
cmd
JamesEggers
fonte
fonte
Respostas:
Não, você não pode com o redirecionamento puro.
Mas com alguns truques (como tee.bat ) você pode.
Eu tento explicar um pouco o redirecionamento.
Você redireciona um dos dez fluxos com arquivo> ou <arquivo
Não é importante, se o redirecionamento for anterior ou posterior ao comando, portanto, essas duas linhas são praticamente as mesmas.
O redirecionamento neste exemplo é apenas um atalho para 1> , isso significa que o fluxo 1 (STDOUT) será redirecionado.
Assim, você pode redirecionar qualquer fluxo acrescentando o número como 2> err.txt e também é permitido redirecionar vários fluxos em uma linha.
Neste exemplo, a "saída padrão" entrará em files.txt, todos os erros estarão em err.txt e o stream3 entrará em nothing.txt (o DIR não usa o stream 3).
Stream0 é STDIN
Stream1 é STDOUT
Stream2 é
STDERR Stream3-9 não são usados
Mas o que acontece se você tentar redirecionar o mesmo fluxo várias vezes?
"Só pode haver um", e é sempre o último!
Portanto, é igual a dir> two.txt
Ok, há uma possibilidade extra, redirecionando um fluxo para outro fluxo.
2> & 1 redireciona stream2 para stream1 e 1> files.txt redireciona tudo para files.txt .
A ordem é importante aqui!
são diferentes. O primeiro redireciona tudo (STDOUT e STDERR) para NUL,
mas a segunda linha redireciona o STDOUT para NUL e STDERR para o STDOUT "vazio".
Como conclusão, é óbvio que os exemplos de Otávio Décio e andynormancx não podem funcionar.
Ambos tentam redirecionar o stream1 duas vezes, mas "Só pode haver um", e é sempre o último.
Então você recebe
E, na primeira amostra, o redirecionamento do fluxo1 para o fluxo1 não é permitido (e não é muito útil).
Espero que ajude.
fonte
3<&2
(observe o LT em vez de GT) e, em seguida3>errors.txt
. Mas isso terminou mal - toda a saída subseqüente do stderr foi capturada paraerrors.txt
(ou seja, de outros comandos também!).for /f "delims=" %%v in ('dir') do echo %%v>>file.txt
embora.Basta usar a versão do Windows do comando tee do UNIX (encontrado em http://unxutils.sourceforge.net ) desta maneira:
Se você também precisar da saída STDERR, use o seguinte.
O
2>&1
combina a saída STDERR em STDOUT (o fluxo primário).fonte
1>tee a.txt
redirecionará stdout para um arquivo chamado emtee
vez de chamar otee
comando. Alguém pode confirmar que essa resposta funciona para eles?Se você não precisa da saída em tempo real (ou seja, enquanto o programa está gravando), você pode adicionar
depois dessa linha.
fonte
dir > windows-dir.txt & type windows-dir.txt
. Isto também se aplica aos blocos:( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt
. No entanto, se a saída é necessária em tempo real, você pode usar por exemplo uma janela da porta do tee ferramenta para isso ...A solução que funcionou para mim foi: dir> a.txt | digite a.txt .
fonte
Sim, existe uma maneira de mostrar uma única saída de comando no console (tela) e em um arquivo. Usando seu exemplo, use ...
Explicação detalhada:
O
FOR
comando analisa a saída de um comando ou texto em uma variável, que pode ser referenciada várias vezes.Para um comando, como
DIR /B
, coloque aspas simples, como mostrado no exemplo abaixo. Substitua oDIR /B
texto pelo comando desejado.Para exibir texto, coloque o texto entre aspas duplas, como mostrado no exemplo abaixo.
... E com quebra de linha ...
Se houver momentos em que você deseja a saída apenas no console (tela), e outros horários enviados apenas para o arquivo e outros horários enviados para ambos, especifique a cláusula "DO" do loop FOR usando uma variável, como mostrado abaixo em
%TOECHOWHERE%
.fonte
delims=
lugar.fonte
Se você deseja anexar em vez de substituir o arquivo de saída, pode usar
ou
fonte
Minha opção foi esta:
Crie uma sub-rotina que receba a mensagem e automatize o processo de enviá-la ao console e ao arquivo de log.
Se você adicionar uma variável à mensagem, remova as aspas nela antes de enviá-la para a sub-rotina ou poderá danificar seu lote. Claro que isso só funciona para ecoar.
fonte
setlocal enabledelayedexpansion
vez de apenassetlocal
2) Eu uso a expansão atrasada para a variável do arquivo de log, portanto, em>> !logfile!
vez de>> %logfile%
dentro da sub-rotina. Dessa forma, funciona quando chamado de dentro de um bloco de código (como dentro de uma instrução if). 3) Removai a linha "definir mensagem" porque não há necessidade da variável extra. Já o temos,$~1
então tenho osecho $~1
dois comandos de eco.Eu criei um console C # simples que pode lidar com a saída em tempo real para a tela e o log do cmd
O uso do arquivo em lote é o mesmo de como você usa o Unix
tee
E aqui está o repositório que inclui o Tee.exe, caso você não tenha uma ferramenta para compilar https://github.com/iamshiao/Tee
fonte
Eu gosto da resposta da atn, mas não foi tão trivial para mim fazer o download quanto o wintee , que também é de código aberto e oferece apenas a funcionalidade tee (útil se você quiser apenas tee e não todo o conjunto de utilitários unix). Eu aprendi sobre isso com a resposta da davor para Exibindo a saída do prompt de comando do Windows e redirecionando-a para um arquivo , onde você também encontra referência aos utilitários unix.
fonte
A solução fornecida pelo "Tomas R" funciona perfeitamente para a pergunta do OP e está disponível nativamente.
Tente: chkdsk c:> output.txt | digite output.txt
A saída desse comando envolve uma porcentagem de conclusão que é enviada serialmente para o arquivo, portanto, ele ficará um pouco confuso (ou seja, o texto será anexado à medida que avança). Isso não acontece com os bits que são enviados para STDOUT (a tela). É como seria se você apenas executasse o mesmo comando sem redirecionar.
fonte
Eu acho que você quer algo nesse sentido:
Ou se você quiser uma nova linha:
Esses comandos são ótimos para logs.
Nota: Isso às vezes falha e substitui o arquivo de texto inteiro no meu computador.
Outra nota: Se o arquivo não existir, ele será criado.
fonte
>
foi projetado para substituir o arquivo. Use>>
para anexar )