2009-09-15 15 views
5

¿Cómo puedo, en Windows, usar el resultado de un script/comando como argumento para otro script? (Un tubo | no funcionará aquí, ya que otro script no lee de la entrada estándar)Redirigir la salida a un argumento de línea de comando de otro comando en Windows

Demasiado aclarar: Tengo AnotherScript que necesita un argumento arg, por ejemplo:

AnotherScript 12 

ahora quiere que el argumento (12 en el ejemplo) provenga del resultado de un script, llámelo ScriptB. Así que me gustaría algo en la línea de

AnotherScript (ScriptB) 

El AnotherScript es en realidad un script en Python que requiere un argumento, y ScriptB es una secuencia de comandos cygwin bash que produce un número, por lo que la forma en que le gustaría utilizar es algo como:

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

Gracias por las respuestas. Sin embargo, dado el complejo trabajo for 'requerido', he reescrito AnotherScript para leer desde la entrada estándar. Esa parece una mejor solución.

+0

Nos ayudaría si nos diga lo que lee el "otro script" * a partir de entonces, si no es la entrada estándar. – Amber

Respuesta

8

Nota: Todo esto requiere los comandos de estar en un archivo por lotes. De ahí los signos dobles %.

Usted puede utilizar el comando for para capturar la salida del comando:

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

continuación, puede utilizar esa salida de otro comando:

AnotherScript %args% 

Esto hará que %args% para contener la última línea desde la salida ScriptB, sin embargo. Si sólo se devuelve una sola línea se puede rodar esto en una sola línea:

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

Cuando se utiliza fuera de un archivo por lotes que tiene que utilizar en lugar de %x%%x.

Sin embargo, si ScriptB devuelve más de una línea, se ejecuta AnotherScript para cada una de esas líneas. Puede evitar este, aunque sólo dentro de un lote de archivos mediante la ruptura después de que el primer bucle de iteración:

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

Estaba a punto de publicar la misma respuesta. ¡Tu me golpeaste! :) – Paulius

+0

Debería estar trabajando, no pasar el SO :-) – Joey

+0

Para el uso de archivos no por lotes, y si DESEA que el segundo script se ejecute en cada línea, lo siguiente funciona 'cmd/v: on' then 'for/f" delims = "% x in ('findstr string files_eg * .csv') do (establece y =% x & set z =! y :: = ,! & echo! z!) >> results.txt '(hace la sustitución de dos puntos con comas) – mpag

1

¿Guardas los datos en un archivo temporal?

o use una tubería con nombre en lugar de una tubería en el estándar de entrada y salida.

o llame a la otra secuencia de comandos desde la primera y transferir los datos a través de argumentos de comandos

3

usted podría ahorrar la salida de su primer guión para una variable de entorno y el uso de su contenido como parámetro de línea de comando para el segundo guión, si eso es lo que quieres.

Algo como esto:

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

¿No estás haciendo las cosas de manera más complicados de lo necesario?

Llama a AnotherScript desde bash. Donde sea necesario, instale Cygwin solo para que pueda hacer esto.

+0

El problema es (era) que AnotherScript necesita un argumento, y que este argumento es el valor de retorno de scriptB. – Rabarberski

+5

scriptB | xargs AnotherScript – reinierpost

Cuestiones relacionadas