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