2009-09-15 8 views
5

Comment puis-je, sous Windows, utiliser la sortie d'un script/commande comme argument pour un autre script? (Un tuyau | ne fonctionnera pas ici, puisque cet autre script ne lit pas de l'entrée standard)Redirection de la sortie vers un argument de ligne de commande d'une autre commande dans Windows

clarifier trop: je AnotherScript qui a besoin d'un argument arg, par exemple:

AnotherScript 12 

maintenant je voulez que l'argument (12 dans l'exemple) provienne de la sortie d'un script, appelez-le ScriptB. Je voudrais donc quelque chose le long des lignes de

AnotherScript (ScriptB) 

Le AnotherScript est en fait un script python qui nécessite un argument, et ScriptB est un script bash Cygwin qui produit un certain nombre, de sorte que la façon dont je voudrais l'utiliser est quelque chose comme:

c:\Python26\python.exe AnotherScript (c:\cygwin|bin|bash --login -i ./ScriptB) 

Merci pour les réponses. Cependant, étant donné le laborieux 'for' requis, j'ai réécrit AnotherScript pour lire à partir de l'entrée standard. Cela semble être une meilleure solution.

+0

Cela nous aiderait si vous nous dites ce que l '«autre script» * lit * à partir de ce moment, si ce n'est l'entrée standard. – Amber

Répondre

8

Note: Tout cela exige que les commandes d'être dans un fichier batch. D'où les doubles signes %.

Vous pouvez utiliser la commande for pour capturer la sortie de la commande:

for /f "usebackq delims=" %%x in (`ScriptB`) do set args=%%x 

vous pouvez utiliser cette sortie dans une autre commande:

AnotherScript %args% 

Cela entraînera %args% pour contenir la dernière ligne de sortie de ScriptB, cependant. Si elle retourne une seule ligne, vous pouvez rouler cela en une ligne:

for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x 

Lorsqu'il est utilisé en dehors d'un fichier batch que vous devez utiliser %x au lieu de %%x. Toutefois, si ScriptB renvoie plus d'une ligne, AnotherScript s'exécute pour chacune de ces lignes. Vous pouvez contourner cette-mais seulement dans un lot de fichiers par rupture après la première itération de la boucle:

for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x & goto :eof 
+0

J'étais sur le point de poster la même réponse. Tu me bats! :) – Paulius

+0

Je devrais travailler, pas traîner sur SO :-) – Joey

+0

Pour l'utilisation de fichier non-batch, et si vous voulez que le deuxième script s'exécute sur chaque ligne, le travail suivant 'cmd/v: on' alors 'pour/f" delims = "% x dans ('findstr string files_eg * .csv') do (définissez y =% x & définissez z =! y :: =,! & echo! z!) >> results.txt '(fait la substitution de deux points par des virgules) – mpag

1

Sauvegarder les données dans un fichier temporaire?

ou d'utiliser un tuyau nommé au lieu d'un tuyau sur l'entrée standard et la sortie.

ou appelez l'autre script à partir du premier et transférer les données via des arguments de commande

3

Vous pouvez enregistrer la sortie de votre premier script à une variable d'environnement et l'utilisation de son contenu en tant que paramètre de ligne de commande le deuxième script, si c'est ce que vous voulez.

Quelque chose comme ceci:

for /f "delims=" %a in ('first_script.cmd') do @set ouput=%a 
second_script %ouput% 
0

N'êtes-vous pas faire des choses beaucoup plus compliquées que nécessaire?

Appelez AnotherScript à partir de bash. Si nécessaire, installez Cygwin juste pour que vous puissiez le faire.

+0

Le problème est (était) que AnotherScript a besoin d'un argument, et que cet argument est la valeur de retour de scriptB. – Rabarberski

+5

scriptB | xargs AnotherScript – reinierpost

Questions connexes