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

时间:2011-05-17 05:52:55

标签: windows batch-file for-loop cmd io-redirection

我希望目录中的所有csv文件都不包含单词“summary”。在命令提示符下面,我可以输入以下命令

dir /b my_dir\*.csv | find /V "summary"

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

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

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

提前致谢!

4 个答案:

答案 0 :(得分:47)

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

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

转义后,|将成为'分隔字符串的一部分。根据语法,当字符串与循环分开解析时,它仅被解释为特殊符号,作为“子命令”。这是在解析循环之后完成的。

答案 1 :(得分: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
)

答案 2 :(得分:0)

您还可以在单​​引号字符串中嵌入双引号字符串,如下所示:

FOR /f "delims=" %%A in ('"dir /b my_dir\*.csv | find /I /V "summary""') do @(
    ECHO Do something with "%%A"
)

答案 3 :(得分:-3)

查看Windows PowerShell。不是说我自己曾经用过它,请注意。