Windows cmd pass output of one command as parameter to another

21,603

There is no $ operator in cmd.
Redirection operators (<, >, >>) expect files or stream handles.
A pipe | passes the standard output of a command into the standard input of another one.

A for /F loop however is capable of capturing the output of a command and providing it in a variable reference (%A in the example); see the following code:

for /F "usebackq delims=" %A in (`git status -s -b ^| sed -n '2p' ^| cut -d' ' -f2-`) do git diff %A
Share:
21,603

Related videos on Youtube

Arijoon
Author by

Arijoon

Updated on July 09, 2022

Comments

  • Arijoon
    Arijoon almost 2 years

    In linux it is possible t do this:

    git diff $(git status -s -b | sed -n '2p' | cut -d' ' -f2-)
    

    or a simpler case

    ls $(pwd) 
    

    The question is how can I achieve the same in windows? (not using a batch file, a one liner in command prompt). Not all commands support piping so how can we evaluate one and pass result as parameter to another?

    I've tried piping and < and > but none work.

    git diff < (git status -s -b | sed -n '2p' | cut -d' ' -f2-) 
    

    Try that yourself it expects a file. And | doesn't work either as git diff doesn't support it

    git status -s -b | sed -n '2p' | cut -d' ' -f2- | git diff // results in illegal seek
    
    • user2956477
      user2956477 about 7 years
      Use doublequotes in windows instead of singlequotes (as on linux).
    • Bali C
      Bali C about 7 years
      Try escaping the pipe with ^, i.e. -s -b ^| sed
  • Arijoon
    Arijoon about 7 years
    This is exactly what I was looking for. Update for for /F "usebackq delims=" %A in (`git status -s -b ^| sed -n '$1p' ^| cut -d" " -f3`) do git diff %A $2 $3 $4 ($n is command line arguments for this alias) and it'll diff the right file by number from git status output
  • Patrick Michaelsen
    Patrick Michaelsen over 5 years
    Everything is so simple in linux
  • bigjosh
    bigjosh about 3 years
    @PatrickMichaelsen I just spent better part of an hour on a 3 line BASH script because (1) alias just don't work in a shell script, (2) if you assign the output of a command to a variable with var=$(cmd) and that output has JSON in it, then the JSON gets mangled. So maybe we can agree that both BASH and WINBAT suck? :)