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

Posted

tags:

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

for 为 for /r
find 为 find /n
还得将批处理 前文 设定中的 set 。。。。
引用进来
最后还得>>到一个txt中去,
请问如何实现?
谢谢
PS:如果写绝对路径可以实现,但是引用 set中的设定 加%% 就无法实现
所以请教各位大虾 ,非常感谢
变量延迟 试过 没有用

使用扩展命令,在执行这个for的前面增加一行
setlocal enabledelayedexpansion

一般是在批处理文件的最上面添加;

需要使用到 相对路径或者绝对路径的话,可以看for 的帮助:
另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
%~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串

需要什么功能?贴上自己的代码,看是否有其他问题
参考技术A 代码贴出来看看,不然怎么知道你是否需要2次扩展。
只延迟一次,在代码第二行加入setlocal enabledelayedexpansion
引用变量时把%%改为!!
没见代码只能说这么多了。
参考技术B 麻烦你把你的代码发上来,(如果可以的话),我就不信邪。
我用的好好的你不行。

带有 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 命令的例子