批处理中如何在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 循环中未通过“查找”命令获得所需的输出