【问题标题】:Is there a way to perform a negative search mask to forfiles?有没有办法对 forfiles 执行否定搜索掩码?
【发布时间】:2019-07-26 19:12:37
【问题描述】:

我知道如何在 forfiles 命令中使用搜索掩码来定位特定扩展名的文件,但我正在处理一个我想避免特定扩展名并捕获其他所有内容的情况。

有没有一种简单的方法可以通过 forfiles 命令实现这一点,还是我需要编写一个自定义的 for 循环来处理这个过程?我不想运行像下面这样的命令,这会迫使我事先定义我的搜索掩码。

for %G in (.txt, .edi, .csv) do forfiles -p "C:abc\del" -s -m *%G -d -10 -c "cmd /c echo @path"

我的用例是基于单个扩展名递归地从目录中删除所有未加密的文件。这将是我的负值。

【问题讨论】:

  • 为什么不能随便用,... "cmd /c if not @ext == "yourext" echo @path"!或使用For /F "Delims=" %G In ('Dir /A-D^|FindStr /VE "your extensionlist"')Do...
  • 啊,我没想到...我想我总是可以在所有情况下抓住一切,然后在事后过滤(就像你的第一个例子)。
  • @Compo 该解决方案对我来说已经足够了。您介意将其创建为答案并将其关闭吗?
  • 请记住,对于在for 循环中找到的每个文件,都会打开一个新的 cmd.exe 实例。在for 括号中过滤会更有效,然后在do 命令中,然后在forfiles... 创建答案,只是为了将标准for 更改为for /f,或一个简单的if not 命令几乎不需要努力。
  • 我说过,当您回答我所问的关于如何应用否定案例来过滤来自 forfiles 本身的内容的问题时...使用 cmd /c 事后应用过滤器是一种合乎逻辑的方法这解决了这个问题。这是一个你觉得不需要问的问题吗?

标签: batch-file forfiles


【解决方案1】:

如果文件名不是以 PDF 结尾,此批处理文件脚本命令将删除 30 天之前的所有内容。它在 Windows 7 cmd shell 中使用 2003 版的 forfiles

forfiles 不能使用正则表达式,它只处理简单的掩码通配符。这效率低下,但对于少量文件来说还可以。

for /f "delims=" %%X in ('dir /b %DIRNAME% ^|grep -vi pdf$') do forfiles /p %DIRNAME% /m "%%X" /d %DAYNUM% /c "cmd /c del @FILE" ```

【讨论】:

    【解决方案2】:

    根据@Compo 对我的问题的 cmets,将否定搜索掩码应用于 forfiles 命令的一种方法是在事后向 cmd 实现添加一个过滤器,如下所示:

    forfiles /P %localDir% /S /M *.* /C "cmd /c if not @EXT == %ignoredExtension% echo @PATH

    但是,@Compo 提出了一个有效的担忧,即此实现会导致为找到的每个文件打开一个新的 cmd.exe 实例。在文件计数固定或已知为常数的情况下,这可能是一种不错的方法,但更有效的可扩展替代方法是手动创建一个 for 循环,在制作之前将此过滤器应用于 for 循环实例像这样调用 do 操作:

    For /F "Delims=" %%G In ('dir /A-D^|FindStr /VE %ignoredExtensions%')Do @echo %%G

    【讨论】:

    • 请记住ForFiles 变量,在本例中为@EXT,是一个双引号字符串,因此您的比较器需要包含这些。在ForFiles 中,您可以转义内部双引号,或者将它们替换为等效的十六进制0x22,并且为了安全起见,FindStr 还可以使用不区分大小写的/IVE 与多个/C 实例或转义带有反斜杠的句点,例如\.ext1 \.ext2.
    猜你喜欢
    • 2012-07-27
    • 2017-11-24
    • 2017-04-02
    • 2021-11-12
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多