Batch file 有没有一种方法可以对forfiles执行反向搜索掩码?

Batch file 有没有一种方法可以对forfiles执行反向搜索掩码?,batch-file,forfiles,Batch File,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" 我

我知道如何利用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循环在调用do操作之前,在for循环实例处进行筛选,如下所示:


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

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

forfiles
无法使用reg EXP,它只处理掩码的简单通配符。这效率很低,但对于少量文件来说还可以

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

为什么你不能直接使用,
…“cmd/c if not@ext==”yourext“echo@path”
!或者对/F“Delims=“%G In('Dir/A-D^ FindStr/VE“your extensionlist”)使用
)呢…
啊,我没有想到这一点……我想在所有情况下我都能抓住一切,然后在事实发生后过滤(比如你的第一个例子)@Compo这个解决方案对我来说已经足够了。你介意创建一个答案吗?我来结束这个问题。请记住,对于
for
循环中找到的每个文件,都会打开一个新的cmd.exe实例。在
for
括号中过滤,然后在
Do
命令中过滤,然后在
forfiles
…创建一个答案,仅仅是为了将标准的
for
更改为
for/f
,或者更改为一个简单的
(如果不是的话)
命令很难保证这一努力。我在回答问题时说,我问的是如何应用否定格来过滤forfiles本身的内容…使用cmd/c在事实发生后应用过滤器是解决该问题的逻辑方法。这是一个您认为不需要问的问题吗?请记住,
ForFiles
变量(在本例中为
@EXT
)是一个双引号字符串,因此您的比较器需要包含这些变量。在
ForFiles
中,您可以对内部双引号,或将其替换为十六进制等效值,
0x22
,为安全起见,
FindStr
也可以使用大小写不敏感,
/IVE
与多个
/C
实例或用反斜杠转义句点,例如
\.ext1\.ext2