我想使用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
)
答案 0 :(得分:2)
铅笔刀建议将MORE
与FOR /F
一起使用,但这会损坏制表符,并且会挂起64K行输入。最好使用FINDSTR "^"
。奇怪的FOR / F选项语法是一种禁用EOL
和DELIMS
选项的方法,以便精确保留非空白行,只要它们的长度<〜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