【问题标题】:Batch script with for loop and pipe带有 for 循环和管道的批处理脚本
【发布时间】: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
)

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

提前致谢!

【问题讨论】:

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


【解决方案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
)

【讨论】:

  • 欢迎来到 StackOverflow。你愿意做出贡献真是太好了。然而,这是一个普遍的答案。如果您针对所提出的问题量身定制答案,那就更好了。请相应更新。
【解决方案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 永远不会返回的自动化测试有关(尽管有“退出”命令)。我们没有时间进行全面调查,但我想我会提一下。也许它会省去别人调试的麻烦:)
    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2013-10-01
    • 2023-03-06
    相关资源
    最近更新 更多