在批处理文件中读取stdin流

时间:2011-08-08 08:57:48

标签: windows batch-file stdout stdin

是否可以在批处理文件中使用管道stdin流?

我希望能够将一个命令的输出重定向到我的批处理文件process.bat列表中,这样:

C:\>someOtherProgram.exe | process.bat

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

echo OFF
setlocal

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

endlocal
:End

当我用type testFile.txt | process.bat测试时,它会重复打印出第一行。

还有其他办法吗?

4 个答案:

答案 0 :(得分:34)

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将接受空搜索字符串"",并允许搜索反转。这将允许这样的事情:

@echo off
setlocal DisableDelayedExpansion

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

答案 1 :(得分:3)

设置“line=!line:*:=!”语法为:

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

  2. !line:*:=!
    对于此语法,您可以键入“set /?”以查看有关使用变量的官方说明 !var!%var%类似,以获取价值。但!var!表示 延迟扩展

  3. 行var名称

    第一个:变量修改标记。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

@echo off
setlocal DisableDelayedExpansion

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