Lote do Windows CMD, INÍCIO e redirecionamento de saída

34

Gostaria de executar dois programas simultaneamente a partir de um arquivo em lotes e redirecionar a saída do primeiro programa para um arquivo de texto como:

start python 1st.py arg1 arg2 > out.txt
start 2nd.exe %1 arg2 arg3

Enquanto os programas são executados conforme o esperado, toda a saída é mostrada no stdout.

Nenhum
fonte
Isso deve funcionar. Sem saber nada, eu me pergunto se o 1st.py está fazendo algo engraçado com a saída.
zpletan
Não, mas escreve para stderr.
nenhum
É por isso - >apenas redireciona o stdout (eu acho). De qualquer forma, parece que você já tem o que precisa.
zpletan

Respostas:

35

Pode ser necessário fazer o seguinte:

start cmd /c python 1st.py arg1 arg2 ^> out.txt
Patrick Seymour
fonte
Obrigado, mas não funciona para mim (o out.txt nem sequer é criado no diretório local)
nenhum
Eu testei com CScript e um VBscript, então a ideia é sólida. Você está fazendo algo "extra" em sua linha de comando que não está listado aqui, como aspas duplas?
Patrick Seymour
Desculpe, algo deu muito errado - funciona!
nenhum
@ Patrick Seymour, obrigado por sua resposta! Como posso fazer a mesma coisa sem o arquivo .bat? Isso não funciona no cmd: python.exe ^> python_out.txt . Ocorreu um erro: python.exe: não é possível abrir o arquivo '>': [Erro 22] Argumento inválido .
neo
7

O redirecionamento é aplicado ao startcomando, mas de alguma forma não à cmd.exeinstância em que é executado.

Se o >operador escapar, tudo deve funcionar:

start 1st.py arg1 arg2 ^> out.txt

(Se você também deseja redirecionar o stderr, use 2^>-o.)

gravidade
fonte
4
Obrigado, mas não funciona para mim.
nenhum
5

Além disso, se você deseja redirecionar stderr e stdout, isso funciona para mim

iniciar atraso da chamada.bat ^ 1 ^> log.txt ^ 2 ^> ^ & ^ 1

Parece que todo personagem basicamente precisa ser escapado. Este comando normalmente se parece com isso:

delay.bat 1> log.txt 2> & 1

sandos
fonte
5

O que fez o truque para mim foi mover o comando para um arquivo em lotes separado:

rem this first batch file triggers the second one:
start the_second.bat arg1 arg2 out.txt

the_second.bat fica assim:

python 1st.py %1 %2 > %3
Florian Straub
fonte
Esta é uma solução muito deselegante em comparação com a resposta correta.
DavidPostill
2
A "resposta correta" não funcionou para mim com um problema semelhante e achei que poderia ser uma solução que as pessoas pelo menos gostariam de saber.
Florian Straub 27/07
Eu tenho que discordar. Aprender a maneira correta de escapar dos personagens no comando é uma idéia muito melhor.
DavidPostill
Por favor, ensine-me como escapar de anexar saída usando >>.
Florian Straub 28/07
Eu já te disse. Leia a resposta aceita.
DavidPostill