Como posso executar um aplicativo de linha de comando no prompt de comando do Windows e ter a saída exibida e redirecionada para um arquivo ao mesmo tempo?
Se, por exemplo, eu executasse o comando dir > test.txt
, isso redirecionaria a saída para um arquivo chamado test.txt
sem exibir os resultados.
Como eu poderia escrever um comando para exibir a saída e redirecionar a saída para um arquivo no prompt de comando do Windows, semelhante ao tee
comando no Unix?
batch-file
cmd
stdout
tee
Edward Thomson
fonte
fonte
Respostas:
Para expandir a resposta da davor , você pode usar o PowerShell assim:
Se você está tentando redirecionar a saída de um exe no diretório atual, você precisa usar
.\
o nome do arquivo, por exemplo:fonte
dir
no powershell existe um alias para oGet-ChildItem
qual não é como odir
comando interno do cmd . Você precisapowershell "cmd /c dir | tee test.txt"
se quiser que o cmd interno versão2>&1
, por exemplonode 2>&1 | tee debug_log.txt
Consegui encontrar uma solução / solução alternativa de redirecionar a saída para um arquivo e depois para o console:
onde dir é o comando cuja saída precisa ser redirecionada, a.txt é um arquivo para armazenar a saída.
fonte
&
em vez de um|
é necessário para a saída de alguns comandos, comoping
ou7z.exe
dir
. Exemplo:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. O arquivo de relatório do sistema está bloqueado por outro processo.handle output to stderr
- Adicione o2>&1
redirecionamento para que fique assim:dir 2>&1 > a.txt & type a.txt
e você deve ter stderr misturado com stdout.Há uma porta Win32 do
tee
comando Unix , que faz exatamente isso. Consulte http://unxutils.sourceforge.net/ ou http://getgnuwin32.sourceforge.net/fonte
tee
pacote do GnuWin32 , poderá encontrá-lo em gnuwin32.sourceforge.net/packages/coreutils.htm .Confira: wintee
Não há necessidade de cygwin.
Eu encontrei e relatei alguns problemas.
Além disso, você pode verificar unxutils porque contém tee (e não há necessidade de cygwin), mas cuidado com o fato de que as EOLs de saída são semelhantes ao UNIX aqui.
Por último, mas não menos importante, é que, se você possui o PowerShell, pode experimentar o Tee-Object. Digite
get-help tee-object
no console do PowerShell para obter mais informações.fonte
tee
produz em tempo real.wtee
tem a mesma funcionalidade. Se você não se importa com os bugs, tudo ficará bem.@ tori3852
eu achei aquilo
não funcionou (apenas algumas linhas de listagem de diretórios - suspeite de algum tipo de processo de bifurcação e, na segunda parte, o comando 'type' foi encerrado antes da conclusão da listagem de diretórios?), então usei:
que fez - comandos seqüenciais, um é concluído antes do início do segundo.
fonte
&
vez de,&&
se quiser garantir que otype
comando seja executado, mesmo se odir
comando falhar. Isso é útil quando houve alguma forma de erro em seu comando e você ainda deseja ver o arquivo de log no console. Veja o artigo da Microsoft sobre isso . No entanto, isso tem o problema de%errorlevel%
ser definido como o nível de erro detype
(que seria 0).Infelizmente não existe.
Os aplicativos de console do Windows têm apenas um identificador de saída único. (Bem, existem dois
STDOUT
,STDERR
mas isso não importa aqui). O>
redireciona a saída normalmente gravada no identificador do console para um identificador de arquivo.Se você quiser ter algum tipo de multiplexação, use um aplicativo externo para o qual possa desviar a saída. Esse aplicativo pode gravar em um arquivo e no console novamente.
fonte
tee
em * nix também é um aplicativo separado, e não algum redirecionamento no shellUm simples aplicativo de console em C # faria o truque:
Para usar isso, basta inserir o comando de origem no programa e fornecer o caminho de todos os arquivos nos quais você deseja duplicar a saída. Por exemplo:
Irá exibir os resultados de dir, bem como armazenar os resultados em files1.txt e files2.txt.
Observe que não há muito (nada!) No caminho do tratamento de erros acima, e o suporte a vários arquivos pode não ser realmente necessário.
fonte
Isso funciona, embora seja um pouco feio:
É um pouco mais flexível do que algumas das outras soluções, pois funciona declaração por declaração para que você possa usá-lo para acrescentar também. Eu uso isso bastante em arquivos em lotes para registrar e exibir mensagens:
Sim, você pode repetir a instrução ECHO (uma vez para a tela e a segunda vez redirecionando para o arquivo de log), mas isso parece igualmente ruim e é um problema de manutenção. Pelo menos dessa maneira, você não precisa fazer alterações nas mensagens em dois lugares.
Observe que _ é apenas um nome de arquivo curto, portanto, você deve excluí-lo no final do seu arquivo em lotes (se estiver usando um arquivo em lotes).
fonte
type
comandos em linhas separadas (em uma sub-rotina) corrigiu isso.mtee é um pequeno utilitário que funciona muito bem para esse fim. É grátis, a fonte está aberta e funciona.
Você pode encontrá-lo em http://www.commandline.co.uk .
Usada em um arquivo em lotes para exibir a saída E criar um arquivo de log simultaneamente, a sintaxe é assim:
Onde / + significa anexar a saída.
Isso pressupõe que você copiou o mtee para uma pasta que está no PATH, é claro.
fonte
Eu gostaria de expandir um pouco a excelente resposta de Saxon Druce .
Como afirmado, você pode redirecionar a saída de um executável no diretório atual da seguinte maneira:
No entanto, isso só faz logon
stdout
notest.txt
. Também não registrastderr
.A solução óbvia seria usar algo como isto:
No entanto, isso não funcionará para todos os
something.exe
s. Algunssomething.exe
s interpretam o2>&1
argumento como um argumento e falham. A solução correta é ter apenas apóstrofos ao redor dosomething.exe
e seus comutadores e argumentos, da seguinte maneira:fonte
'tee' is not recognized as an internal or external command
por razões óbvias. Com a2>&1
linha cmd interna, qualquer saída para stderr causa erros no PowerShell.Concordo com Brian Rasmussen, a porta unxutils é a maneira mais fácil de fazer isso. Na seção Arquivos em lote de suas páginas de script, Rob van der Woude fornece muitas informações sobre o uso de comandos do MS-DOS e CMD. Eu pensei que ele poderia ter uma solução nativa para o seu problema e, depois de procurar por lá, encontrei o TEE.BAT , que parece ser exatamente isso, uma implementação em lote do tee do MS-DOS. É um arquivo em lotes de aparência bastante complexa e minha inclinação ainda seria usar a porta unxutils.
fonte
Se você tiver o cygwin no caminho do ambiente do Windows, poderá usar:
fonte
dir 1>a.txt 2>&1 | type a.txt
Isso ajudará a redirecionar STDOUT e STDERR
fonte
Eu sei que esse é um tópico muito antigo, mas nas respostas anteriores não há uma implementação completa de um Tee em tempo real escrito em Lote. Minha solução abaixo é um script híbrido Batch-JScript que usa a seção JScript apenas para obter a saída do comando canalizado, mas o processamento dos dados é feito na seção Lote. Essa abordagem tem a vantagem de que qualquer programador em lote pode modificar esse programa para atender a necessidades específicas. Este programa também processa corretamente a saída do comando CLS produzido por outros arquivos em lote, ou seja, limpa a tela quando a saída do comando CLS é detectada.
fonte
file.exe 2>output.txt
file.exe 2>&1|tee.bat
que é encontrado aqui: superuser.com/questions/452763/…Eu também estava procurando a mesma solução, depois de uma pequena tentativa, consegui isso no Prompt de Comando. Aqui está a minha solução:
Ele também captura qualquer comando PAUSE.
fonte
Aqui está uma amostra do que eu usei com base em uma das outras respostas
fonte
Algo assim deve fazer o que você precisa?
fonte
enviar saída para o console, anexar ao log do console, excluir saída do comando atual
fonte
Essa é uma variação de uma resposta anterior do MTS, mas adiciona algumas funcionalidades que podem ser úteis para outras pessoas. Aqui está o método que eu usei:
set _Temp_Msg_Cmd=
^
caractere cenoura para que os comandos não sejam avaliados inicialmente%~n0_temp.txt
que usa a sintaxe de extensão de parâmetro da linha de comando%~n0
para obter o nome do arquivo em lotes.%~n0_log.txt
Aqui está a sequência de comandos:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Aqui está o exemplo:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
Dessa forma, o comando pode ser simplesmente acrescentado após comandos posteriores em um arquivo em lotes que parece muito mais limpo:
echo test message %_Temp_Msg_Cmd%
Isso pode ser adicionado ao final de outros comandos também. Tanto quanto posso dizer, funcionará quando as mensagens tiverem várias linhas. Por exemplo, o comando a seguir gera duas linhas se houver uma mensagem de erro:
net use M: /D /Y %_Temp_Msg_Cmd%
fonte
Isso criará um arquivo de log com a data e hora atuais e você poderá usar as linhas do console durante o processo
fonte
Eu uso uma sub-rotina em lote com uma instrução "for" para obter a saída do comando, uma linha de cada vez, e ambas gravamos essa linha em um arquivo e a saída no console.
fonte
Se você estiver na CLI, por que não usar um loop FOR para "FAZER" o que quiser:
Grande recurso no Windows CMD para loops: https://ss64.com/nt/for_cmd.html A chave aqui é definir os delímetros (delims), que quebrariam cada linha de saída, para nada. Dessa forma, ele não quebrará o padrão de espaço em branco. O% a é uma letra arbitrária, mas é usada na seção "do" para, bem ... fazer algo com os caracteres que foram analisados em cada linha. Nesse caso, podemos usar o "e comercial" (&&) para executar o segundo comando echo para criar-ou-acrescentar (>>) a um arquivo de nossa escolha. Mais seguro para manter essa ordem de comandos DO, caso haja um problema ao escrever o arquivo, pelo menos obteremos o eco no console primeiro. O sinal de arroba (@) na frente do primeiro eco impede o console de mostrar o próprio comando echo e, em vez disso, apenas exibe o resultado do comando que deve exibir os caracteres em% a. Caso contrário, você verá:
UPDATE: / F ignora as linhas em branco e a única solução é pré-filtrar a saída, adicionando um caractere a cada linha (talvez com números de linha por meio do comando find). Resolver isso na CLI não é rápido ou bonito. Além disso, eu não incluí o STDERR, então aqui também está capturando erros:
Redirecionando mensagens de erro
Os sinais de intercalação (^) estão lá para escapar dos símbolos após eles, porque o comando é uma sequência que está sendo interpretada, ao contrário de dizer, inserindo-a diretamente na linha de comando.
fonte
Assim como o unix.
dir | tee a.txt
Funciona No Windows XP, ele requer
mksnt
instalado.Ele é exibido no prompt e também é anexado ao arquivo.
fonte
A seguir, ajuda se você deseja algo realmente visto na tela - mesmo se o arquivo em lotes foi redirecionado para um arquivo. O dispositivo CON também pode ser usado se for redirecionado para um arquivo
Exemplo:
Consulte também uma boa descrição de redirecionamento: http://www.p-dd.com/chapter7-page14.html
fonte
Você pode encontrar esses comandos em biterscripting ( http://www.biterscripting.com ) úteis.
fonte
Isso funciona em tempo real, mas também é meio feio e o desempenho é lento. Também não foi bem testado:
fonte
%MYCOMMAND%
terminar e falha em muitos casos. Ela ignora as linhas em branco, as linhas começando com;
falha com conteúdo como<space>/<TAB>
,ON
,OFF
ou/?
. Mas o resto às vezes pode funcionar :-)Uma alternativa é tee stdout para stderr dentro do seu programa:
em java:
Em seguida, no seu arquivo de lote dos:
java program > log.txt
O stdout irá para o arquivo de log e o stderr (os mesmos dados) será exibido no console.
fonte
Eu instalo o perl na maioria das minhas máquinas para obter uma resposta usando o perl: tee.pl
dir perl tee.pl ou dir | perl tee.pl dir.bat
bruto e não testado.
fonte
Outra variação é dividir o tubo e redirecionar a saída como desejar.
Salve o acima em um arquivo .bat. Ele divide a saída de texto no fluxo de arquivos 1 para o fluxo 3 também, que você pode redirecionar conforme necessário. Nos meus exemplos abaixo, chamei o script acima splitPipe.bat ...
fonte
c:\cygwin64\bin\script.exe
e digitecmd
e digiteexit
e digite (sai do cmd.exe do Cygwin)exit
e digite (sai do script.exe do Cygwin)fonte