Redirecting output to a command-line argument of another command in Windows

10,191

Solution 1

Note: All this requires the commands to be in a batch file. Hence the double % signs.

You can use the for command to capture the output of the command:

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

then you can use that output in another command:

AnotherScript %args%

This will cause %args% to contain the last line from ScriptB's output, though. If it only returns a single line you can roll this into one line:

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

When used outside a batch file you have to use %x instead of %%x.

However, if ScriptB returns more than one line, AnotherScript runs for each of those lines. You can circumvent this—though only within a batch file—by breaking after the first loop iteration:

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

Solution 2

You could save the output of your first script to an environment variable and the use its content as command line parameter to the second script, if that is what you want.

Something like this:

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

Solution 3

Save the data into a temporary file?

or use a named pipe instead of a pipe on the standard in and output.

or call the other script from the first one and transfer the data via command arguments

Share:
10,191
Rabarberski
Author by

Rabarberski

Updated on June 27, 2022

Comments

  • Rabarberski
    Rabarberski about 2 years

    How can I, in Windows, use the output of a script/command as an argument for another script? (A pipe | will not work here, since that other script doesn't read from the standard input)

    Too clarify: I have AnotherScript that needs an argument arg, e.g.:

    AnotherScript 12
    

    now I want the argument (12 in the example) to come from the output of a script, call it ScriptB. So I would like something along the lines of

    AnotherScript (ScriptB)
    

    The AnotherScript is actually a python script that requires an argument, and ScriptB is a cygwin bash script that produces some number, so the way I would like to use it is something like:

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

    Thanks for the answers. However, given the laborious 'for' construct required, I've rewritten AnotherScript to read from the standard input. That seems like a better solution.