Registrar uma saída inteira do arquivo em lote

11

Estou usando um script de linha de comando para ajustar várias configurações em um computador. No entanto, eu gostaria que toda a saída também fosse registrada em um arquivo .txt ou .log.

Quando uso meu conhecimento básico do sistema de log, ele coloca a saída em um arquivo, mas na verdade não é executada. No meu caso, eu precisaria executá-lo e depois entrar em um arquivo para referência posterior.

Alguém seria capaz de me dizer como fazer isso?

Desde já, obrigado! Dempsey

Dempsey FoxDie Van Assche
fonte
Você nem especificou um sistema operacional!
Michael Hampton

Respostas:

10

Se a pergunta solicitar que um script seja "executado" e o arquivo em lotes inteiro ser enviado para um arquivo de log no Windows 8.1, então aqui está a resposta simples:

Inclua isso no início do seu arquivo em lotes ...

@echo off
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B

:LOG
[ your script goes here ]
Ingrid
fonte
Excelente, obrigado! (Claro,% LOGFILE% não é realmente necessário aqui: P.)
Andrew
11
Meu script faz uma pergunta - não estou vendo se for usado. Como registrar tudo e vê-lo na tela durante a execução?
Simon
Sim, como você faria isso para poder vê-lo enquanto estiver na tela?
karl-police
3

Na sua pergunta, você menciona:

"... ele colocará a saída em um arquivo, mas na verdade não será executada. No meu caso, eu precisaria executá-la e depois entrar em um arquivo para referência posterior."

Como você diz que o programa está sendo executado e sua saída está sendo colocada no arquivo, pensei que você poderia ter significado "exibido" , em vez de "executado" .

Se não foi isso que você quis dizer, provavelmente teria ajudado se isso fosse explicado melhor, talvez com alguma amostra de saída.

De qualquer forma, estou postando esta resposta, caso haja outras pessoas que achem essa pergunta / resposta útil.

Então, basicamente, parece que você deseja que a saída de um script seja capturada em um arquivo e também seja possível ver a saída do script na tela enquanto o script estiver em execução.

(tl; dr version: use wintee , assim:

script 2>&1 | wtee logfile.txt)


Para esta postagem, usarei um pequeno arquivo de lote de teste, mas seu script pode ser tão grande e complicado ou simples quanto necessário:

C:\>type a.cmd
@echo off

echo Command: "dir /b a*"
dir /b a*
echo.

echo Command: "dir /b non-existant-file"
dir /b non-existant-file
echo.


É o que acontece quando executo esse script em lote:

C:\>a.cmd
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

Observe que no script de teste, a primeira execução do comando "dir" é bem-sucedida e a segunda falha. Eu faço isso apenas para mostrar o que acontecerá com as "mensagens de erro" quando você executar seu script.

Se eu executar o script e usar o redirecionamento ( ">" ) para capturar a saída, verei isso

C:\>a.cmd > log.txt
File Not Found

C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"

C:\>

Observe que a mensagem de erro "Arquivo não encontrado" foi mostrada na tela quando o script foi executado e não foi realmente capturada no arquivo. Isso ocorre porque ">" captura "saída normal" que foi enviada ao fluxo STDOUT. "Mensagens de erro" são normalmente enviadas para o fluxo STDERR.

Para capturar "saída normal" e "mensagens de erro", você também precisa capturar o fluxo STDERR, indicado pelo "2" em "2> & 1" no comando aqui:

C:\>a.cmd > log.txt 2>&1
C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

No unix, há um comando padrão: "tee"

Usando o comando "tee", você pode capturar a saída de um programa e também exibir a saída na tela ao mesmo tempo.

O comando "tee" não é padrão no Windows, mas você pode baixar uma versão gratuita do "tee" para windows aqui: wintee . O programa baixado é chamado: "wtee.exe".

Você usa o programa "wtee.exe" como mostrado abaixo.

Isso capturará a saída do script para o arquivo nomeado "log.txt"como antes e também exibirá a saída na tela enquanto o script estiver em execução:

C:\>a.cmd 2>&1 | wtee log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found
Kevin Fegan
fonte
0

Este script executará ls e registrará sua saída em um arquivo chamado log.txt:

exec >log.txt 2>&1
ls

O log não será executado.

Thorsten Staerk
fonte
11
Observe que isso assume o Unix / Linux, mas meu palpite é que o OP fala sobre o Windows. Também não é executar um script, mas registrando a saída dos comandos digitados e omite a informação crítica de como parar a loucura ...
Sven
Na verdade, estou falando do Windows. Obrigado embora :)
Dempsey FoxDie Van Assche