在batch file中读取标准inputstream

是否可以在batch file中使用pipe道标准inputstream?

我希望能够将一个命令的输出redirect到我的batch fileprocess.bat列表中,如下所示:

 C:\>someOtherProgram.exe | process.bat 

我的第一次尝试看起来像:

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

当我testing它与type testFile.txt | process.bat type testFile.txt | process.bat重复打印第一行。

有另一种方法吗?

Solutions Collecting From Web of "在batch file中读取标准inputstream"

set /p不能用于管道,它会从输入中取出一行(随机)。
但是你可以在for循环中使用more内容。

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

但是,这个行以分号开始(如EOL的FOR-LOOP标准)是失败的。
而且它不能读空行。
但是用findstr也可以解决这个问题,它在每行的前面加上一些字母,这样就不会出现空行。
然后前缀被删除到第一个冒号。

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

或者,在一些不包含findstr环境(如WinRE)中,使用find.exe的替代find.exe可能就足够了。 find将接受一个空的搜索字符串"" ,并允许搜索反转。 这将允许这样的事情:

 @echo off setlocal DisableDelayedExpansion for /F "tokens=*" %%a in ('find /v ""') do ( set "line=%%a" echo(!line! ) 

设置“ line=!line:*:=! ”的语法是:

  1. 设置需要一个参数是a=b
    如果a包含空格或其他内容,则必须在此参数周围使用引号。 在这里,我没有看到任何

  2. !line:*:=!
    对于这个语法,你可以输入' set /? '看到关于使用变量的官方描述。
    !var! 就像%var% ,来获得这个值。 但是!var! 意味着延期扩张

行var名称

第一个:可变修饰标记。

**:= **:= (空),用(空)替换变量值中匹配“ *: ”的字符串(实际上从字符串start到first : occurence),即删除从开始到第一个冒号的子字符串。

 FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO ( > CON ECHO.%%B >> %File% ECHO.%%B ) 

来源: http : //www.robvanderwoude.com/unixports.php#TEE

或者,在一些不包含findstr环境(如WinRE)中,使用find.exe的替代find.exe可能就足够了。 find将接受一个空的搜索字符串"" ,并允许搜索反转。 这将允许这样的事情:

 @echo off setlocal DisableDelayedExpansion for /F "tokens=*" %%a in ('find /v ""') do ( set "line=%%a" echo(!line! )