Windows CMD Batch, START et redirection de sortie

34

Je voudrais exécuter deux programmes simultanément à partir d'un fichier de commandes et rediriger la sortie du premier programme dans un fichier texte comme:

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

Pendant que les programmes s'exécutent comme prévu, toutes les sorties sont affichées sur stdout.

aucun
la source
Cela devrait fonctionner. Sans rien savoir, je me demande si 1st.py fait quelque chose de drôle avec la sortie.
zpletan
Non, mais il écrit à stderr.
aucun
C'est pourquoi - >redirige uniquement stdout (je pense). Dans tous les cas, il semble que vous ayez déjà ce dont vous avez besoin.
zpletan

Réponses:

35

Vous devrez peut-être procéder de cette façon:

start cmd /c python 1st.py arg1 arg2 ^> out.txt
Patrick Seymour
la source
Merci, mais cela ne fonctionne pas pour moi (out.txt n'est même pas créé dans le répertoire local)
aucun
Je l'ai testé avec CScript et un VBscript, donc l'idée est bonne. Faites-vous quelque chose "supplémentaire" dans votre ligne de commande qui n'est pas répertoriée ici, comme des guillemets doubles?
Patrick Seymour
Désolé, quelque chose s'est terriblement mal passé - ça marche!
aucun
@Patrick Seymour, merci pour votre réponse! Comment puis-je faire la même chose sans le fichier .bat? Cela ne fonctionne pas à partir de cmd: python.exe ^> python_out.txt . J'ai eu une erreur: python.exe: impossible d'ouvrir le fichier '>': [Errno 22] Argument invalide .
neo
7

La redirection est appliquée à la startcommande, mais pas à l' cmd.exeinstance qu'elle exécute.

Si l' >opérateur est échappé, tout devrait fonctionner:

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

(Si vous souhaitez également rediriger stderr, utilisez 2^>-le.)

grawity
la source
4
Merci, mais ça ne marche pas pour moi.
aucun
5

De plus, si vous souhaitez rediriger à la fois stderr et stdout, cela fonctionne pour moi

démarrer l'appel delay.bat ^ 1 ^> log.txt ^ 2 ^> ^ & ^ 1

Il semble que chaque personnage doive être échappé. Cette commande ressemble normalement à ceci:

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

sandos
la source
5

Pour moi, l'astuce a été de déplacer la commande dans un fichier de commandes distinct:

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

the_second.bat ressemble alors à ceci:

python 1st.py %1 %2 > %3
Florian Straub
la source
Il s'agit d'une solution de contournement très inélégante par rapport à la bonne réponse.
DavidPostill
2
La «bonne réponse» n'a pas fonctionné pour moi avec un problème similaire et j'ai pensé que ce pourrait être une solution que les gens voudraient au moins connaître.
Florian Straub
Je dois être en désaccord. Apprendre la bonne façon d'échapper aux personnages aux commandes est une bien meilleure idée.
DavidPostill
S'il vous plaît, apprenez-moi comment échapper à la sortie attachée en utilisant >>.
Florian Straub
Je te l'ai déjà dit. Lisez la réponse acceptée.
DavidPostill