在批处理文件中读取stdin流

m0t*_*ive 33 windows stdin stdout batch-file

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

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

C:\>someOtherProgram.exe | process.bat
Run Code Online (Sandbox Code Playgroud)

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

echo OFF
setlocal

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

endlocal
:End
Run Code Online (Sandbox Code Playgroud)

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

还有另外一种方法吗?

jeb*_*jeb 34

set /p不适用于管道,它从输入中获取一条(随机)线.
但是你可以more在for循环中使用.

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

但是这会以以分号开头的行失败(因为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
)
Run Code Online (Sandbox Code Playgroud)

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

@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" %%a in ('find /v ""') do (
  ...
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`FINDSTR/N"^"`.该搜索将正确返回所有行,包括unix格式化的行以及可能不以换行符结尾的任何最终行. (6认同)