有没有办法对文件执行否定搜索掩码?

Is there a way to perform a negative search mask to forfiles?

我知道如何在 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"

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

根据@Compo 对我的问题的评论,将否定搜索掩码应用于 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

如果文件名不以 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" ```