批处理中如何在for循环中使用 find命令 ,尤其是引用相对路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理中如何在for循环中使用 find命令 ,尤其是引用相对路径相关的知识,希望对你有一定的参考价值。

参考技术A 你好!
代码贴出来看看,不然怎么知道你是否需要2次扩展。
只延迟一次,在代码第二行加入setlocal
enabledelayedexpansion
引用变量时把%%改为!!
没见代码只能说这么多了。
如有疑问,请追问。

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

【中文标题】带有 for 循环和管道的批处理脚本【英文标题】:Batch script with for loop and pipe 【发布时间】:2011-08-26 23:22:30 【问题描述】:

我想要文件名不包含单词“summary”的目录中的所有 csv 文件。在命令提示符中,我可以键入以下命令

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
)

有人可以告诉我如何解决上述问题吗?

提前致谢!

【问题讨论】:

DOS 中没有for /f。 cmd.exe and DOS are completely different things 【参考方案1】:

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

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

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

【讨论】:

不!我得到了find: /V':找不到这样的文件或目录:summary': No such file or directory @Gilbeg:对我有用。你确定你没有错过任何东西? my_dir\*.csv 是否包含空格?如果是这样,它是否用双引号括起来?尽管这仍然几乎不会产生该错误消息。【参考方案2】:

如果您遇到 Gilbeg 遇到“find: /V': No such file or directory”的问题,那么很可能您的路径中有 cygwin 或类似文件,并且批处理文件没有使用 Windows 查找命令。如果您修改脚本以使用 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
)

【讨论】:

欢迎来到 ***。你愿意做出贡献真是太好了。然而,这是一个普遍的答案。如果您针对所提出的问题量身定制答案,那就更好了。请相应更新。【参考方案3】:

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

FOR /f "delims=" %%A in ('"dir /b my_dir\*.csv | find /I /V "summary""') 做@( ECHO 用“%%A”做点什么 )

【讨论】:

【参考方案4】:

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

【讨论】:

不幸的是 PowerShell 是客户端想要去的路径。 Powershell 运行良好,但请注意,我之前从 bat 文件调用时遇到过不稳定问题(例如,调用 powershell.exe -command "blah blah blah")。这在很大程度上与 PS 子shell 永远不会返回的自动化测试有关(尽管有“退出”命令)。我们没有时间进行全面调查,但我想我会提一下。也许它会省去别人调试的麻烦:)

以上是关于批处理中如何在for循环中使用 find命令 ,尤其是引用相对路径的主要内容,如果未能解决你的问题,请参考以下文章

Windows批处理-for命令详解

在 Windows 批处理脚本的 for 循环中未通过“查找”命令获得所需的输出

我将如何隔离或仅将第二个元素存储在批处理文件内的 for 循环中?

如何在命令提示符下创建一个“for”循环?

批处理循环语句 ?

批处理文件中 find 命令的例子