是否可以在批处理文件中使用管道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
测试时,它会重复打印出第一行。
还有其他办法吗?
答案 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:*:=!
”语法为:
set需要一个a=b
参数
如果a包含空格或其他内容,则必须使用此参数周围的引号。在这里,我没有看到任何
!line:*:=!
对于此语法,您可以键入“set /?
”以查看有关使用变量的官方说明
!var!
与%var%
类似,以获取价值。但!var!
表示 延迟扩展 。
行var名称
第一个:变量修改标记。
**:= **:=
(空),将变量值中的字符串替换为“*:
”(实际上从字符串开始到第一个:
出现)用(空)替换,即删除子串从开始到第一个冒号。
答案 2 :(得分:1)
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
> CON ECHO.%%B
>> %File% ECHO.%%B
)
答案 3 :(得分:1)
或者,在某些不包含findstr
的环境(如WinRE)上,使用find.exe
的替代方案可能就足够了。 find
将接受空搜索字符串""
,并允许搜索反转。这将允许这样的事情:
@echo off
setlocal DisableDelayedExpansion
for /F "tokens=*" %%a in ('find /v ""') do (
set "line=%%a"
echo(!line!
)