是否可以在batch file中使用pipe道标准inputstream?
我希望能够将一个命令的输出redirect到我的batch fileprocess.bat
列表中,如下所示:
C:\>someOtherProgram.exe | process.bat
我的第一次尝试看起来像:
echo OFF setlocal :again set /p inputLine="" echo.%inputLine% if not (%inputLine%)==() goto again endlocal :End
当我testing它与type testFile.txt | process.bat
type testFile.txt | process.bat
重复打印第一行。
有另一种方法吗?
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.exe
可能就足够了。 find
将接受一个空的搜索字符串""
,并允许搜索反转。 这将允许这样的事情:
@echo off setlocal DisableDelayedExpansion for /F "tokens=*" %%a in ('find /v ""') do ( set "line=%%a" echo(!line! )
设置“ line=!line:*:=!
”的语法是:
设置需要一个参数是a=b
。
如果a包含空格或其他内容,则必须在此参数周围使用引号。 在这里,我没有看到任何
!line:*:=!
对于这个语法,你可以输入' set /?
'看到关于使用变量的官方描述。
!var!
就像%var%
,来获得这个值。 但是!var!
意味着延期扩张 。
行var名称
第一个:可变修饰标记。
**:= **:=
(空),用(空)替换变量值中匹配“ *:
”的字符串(实际上从字符串start到first :
occurence),即删除从开始到第一个冒号的子字符串。
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO ( > CON ECHO.%%B >> %File% ECHO.%%B )
来源: http : //www.robvanderwoude.com/unixports.php#TEE
或者,在一些不包含findstr
环境(如WinRE)中,使用find.exe
的替代find.exe
可能就足够了。 find
将接受一个空的搜索字符串""
,并允许搜索反转。 这将允许这样的事情:
@echo off setlocal DisableDelayedExpansion for /F "tokens=*" %%a in ('find /v ""') do ( set "line=%%a" echo(!line! )