Redirection de la sortie vers un argument de ligne de commande d'une autre commande sous Windows
Question
Comment puis-je, dans Windows, utiliser la sortie d'un script / d'une commande comme argument d'un autre script? (Un tuyau | ne fonctionnera pas ici, car cet autre script ne lit pas à partir de l'entrée standard)
Trop clarifier: j'ai un autre script qui nécessite un argument, par exemple:
AnotherScript 12
Je souhaite maintenant que l'argument (12 dans l'exemple) provienne de la sortie d'un script, appelez-le ScriptB. Je voudrais donc quelque chose dans le sens de
AnotherScript (ScriptB)
AnotherScript est en fait un script python qui nécessite un argument, et ScriptB est un script cygwin bash qui produit un nombre. Par conséquent, la façon dont je voudrais l’utiliser ressemble à ceci:
c:\Python26\python.exe AnotherScript (c:\cygwin|bin|bash --login -i ./ScriptB)
Merci pour les réponses. Cependant, compte tenu de la construction laborieuse "pour" requise, j'ai réécrit AnotherScript pour le lire à partir de l'entrée standard. Cela semble être une meilleure solution.
La solution
Remarque: tout cela nécessite que les commandes soient dans un fichier de commandes. D’où le double signe %
.
Vous pouvez utiliser la commande pour
pour capturer le résultat de la commande:
for /f "usebackq delims=" %%x in (`ScriptB`) do set args=%%x
alors vous pouvez utiliser cette sortie dans une autre commande:
AnotherScript %args%
Cependant, % args%
contiendra la dernière ligne de la sortie de ScriptB
, cependant. Si elle ne renvoie qu'une seule ligne, vous pouvez la transformer en une seule ligne:
for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x
Lorsqu'il est utilisé en dehors d'un fichier de commandes, vous devez utiliser % x
au lieu de %% x
.
Toutefois, si ScriptB
renvoie plusieurs lignes, AnotherScript
est exécuté pour chacune de ces lignes. Vous pouvez contourner cette & # 8212; bien que dans un fichier de commandes & # 8212; en interrompant après la première itération de la boucle:
for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x & goto :eof
Autres conseils
Vous pouvez enregistrer la sortie de votre premier script dans une variable d'environnement et utiliser son contenu comme paramètre de ligne de commande dans le second script, si vous le souhaitez.
Quelque chose comme ça:
for /f "delims=" %a in ('first_script.cmd') do @set ouput=%a
second_script %ouput%
Enregistrer les données dans un fichier temporaire?
ou utilisez un tuyau nommé au lieu d'un tuyau dans l'entrée et la sortie standard.
ou appelez l’autre script du premier et transférez les données via les arguments de la commande
Ne faites-vous pas des choses beaucoup plus compliquées que nécessaire?
Appelez AnotherScript à partir de bash. Si nécessaire, installez Cygwin pour pouvoir le faire.