如何在Windows批处理文件中获取管道输入?

时间:2018-09-30 07:49:08

标签: batch-file

我想使用xxx yyy | deal_everyline.bat之类的命令,其中命令xxx yyy将产生一些输出。当我在控制台中使用deal_everyline.bat时,一切正常运行。但是,当我使用cat A.txt | deal_everyline.bat测试它时,它仅输出第一行。我应该怎么做才能获得所有线路?

@echo off
:loop
set input=
set /p input=
if "%input%" neq "" (
    echo %input%
    goto loop
)

1 个答案:

答案 0 :(得分:2)

铅笔刀建议将MOREFOR /F一起使用,但这会损坏制表符,并且会挂起64K行输入。最好使用FINDSTR "^"。奇怪的FOR / F选项语法是一种禁用EOLDELIMS选项的方法,以便精确保留非空白行,只要它们的长度<〜8191字节即可。

@echo off
for /f delims^=^ eol^= %%A in ('findstr "^"') do (
  echo(%%A
)

上面的代码将跳过空行。如果要保留它们,则使用FINDSTR / N选项为每行添加行号前缀,后跟冒号,将值保存在环境变量中,然后使用变量扩展删除前缀。必须使用FOR循环中的延迟扩展来扩展变量,但是在扩展%%A时不能启用延迟扩展,否则它将破坏!字符。因此,延迟扩展可以在循环内打开和关闭

@echo off
setlocal disableDelayedExpansion
for /f delims^=^ eol^= %%A in ('findstr /n "^"') do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  set "ln=!ln:*:=!"
  echo(!ln!
  endlocal
)

如果要在迭代过程中保留环境变量的更改,请调用具有延迟扩展功能的子例程。但是请注意,变量的正常百分比扩展可能会失败,具体取决于内容。例如,未加引号的<>&|都会引起问题。

@echo off
setlocal disableDelayedExpansion
for /f delims^=^ eol^= %%A in ('findstr /n "^"') do (
  set "ln=%%A"
  call :processLine
)
exit /b

:processLine
set "ln=%ln:*:=%"
echo(%ln%
exit /b
相关问题