带有for循环和管道的批处理脚本

Gil*_*beg 24 windows for-loop cmd batch-file io-redirection

我想在一个目录中的所有csv文件,其文件名不包含单词"summary".在命令提示符下面,我可以输入以下命令

dir /b my_dir\*.csv | find /V "summary"
Run Code Online (Sandbox Code Playgroud)

当我尝试将上述命令转移到批处理文件时,我遇到了一个问题,即for循环中不支持管道命令.那是我不能做到以下几点

FOR /f %%A in ('dir /b my_dir\*.csv | find /V "summary"') do (
rem want to do something here
)
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下如何解决上述问题吗?

提前致谢!

And*_*y M 48

您需要转义|字符以防止在解析循环命令时对其进行解释.使用^逃脱它:

FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" ^| find /V "summary"') do (
rem do what you want with %%A here
)
Run Code Online (Sandbox Code Playgroud)

一旦转义,它|就会成为'-delimited字符串的一部分.根据语法,当字符串与循环分开解析时,它仅被解释为特殊符号,作为"子命令".这是解析循环之后完成的.


小智 5

如果你遇到Gilbeg得到"查找:/ V':没有这样的文件或目录"的问题,那么很可能你的路径中有cygwin或类似文件,批处理文件没有使用Windows find命令.如果您修改脚本以使用Windows查找的绝对路径,则错误将消失:

FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" ^| %SYSTEMROOT%\system32\find.exe /V "summary"') do (
rem want to do something here with %%A
)
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到StackOverflow.你想做出贡献真是太棒了.但是,这是一般答案.如果您根据问题量身定制答案,情况会好得多.请相应更新. (2认同)

Phi*_*ard -5

查看 Windows PowerShell。请注意,我自己并没有使用过它。