Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read stdin stream in a batch file

Is it possible to use a piped stdin stream inside a batch file?

I want to be able to redirect the output of one command into my batch file process.bat list so:

C:\>someOtherProgram.exe | process.bat 

My first attempt looked like:

echo OFF setlocal  :again set /p inputLine="" echo.%inputLine% if not (%inputLine%)==() goto again  endlocal :End 

When I test it with type testFile.txt | process.bat it prints out the first line repeatedly.

Is there another way?

like image 685
m0tive Avatar asked Aug 08 '11 08:08

m0tive


1 Answers

set /p doesn't work with pipes, it takes one (randomly) line from the input.
But you can use more inside of an for-loop.

@echo off setlocal for /F "tokens=*" %%a in ('more') do (   echo #%%a ) 

But this fails with lines beginning with a semicolon (as the FOR-LOOP-standard of eol is ;).
And it can't read empty lines.
But with findstr you can solve this too, it prefix each line with the linenumber, so you never get empty lines.
And then the prefix is removed to the first colon.

@echo off setlocal DisableDelayedExpansion  for /F "tokens=*" %%a in ('findstr /n "^"') do (   set "line=%%a"   setlocal EnableDelayedExpansion   set "line=!line:*:=!"   echo(!line!   endlocal ) 

Alternatively, on some environments (like WinRE) that don't include findstr, an alternative with find.exe might suffice. find will accept a null search string "", and allows search inversion. This would allow something like this:

@echo off setlocal DisableDelayedExpansion  for /F "tokens=*" %%a in ('find /v ""') do (   ... 
like image 95
jeb Avatar answered Sep 19 '22 15:09

jeb