删除*。*不包括某些扩展名

时间:2012-02-24 02:06:28

标签: batch-file cmd

我试图在Windows上制作一个批处理文件,用于删除当前目录中的所有文件,但不包括4个文件扩展名(log,sdb,sdk,bat)。

我在Windows上尝试过Forfiles命令,但这会删除当前文件夹(甚至是bat文件)上的所有内容。我的命令是:

@ECHO OFF
FORFILES /M *.* /C "cmd /c IF NOT @ext=="sdb" (IF NOT @ext=="sbk" (IF NOT @ext=="log" (IF NOT @ext=="bat" DEL @FILE)))" /Q

我怎样才能让它发挥作用?

非常感谢!

6 个答案:

答案 0 :(得分:9)

  • 必须使用\
  • 转义内部引号
  • 您可能需要IF /I(不区分大小写)选项
  • 您应该使用@ISDIR来排除目录
  • DEL / Q选项是在最后一次引用之后,应该在最后一次引用之前,但不需要
  • 不需要括号
  • 由于您的面具是“所有文件”
  • ,因此不需要FORFILES / M选项

这应该有效

@echo off
forfiles /c "cmd /c if @isdir equ FALSE if /i not @ext==\"sdb\" if /i not @ext==\"sbk\" if /i not @ext==\"log\" if /i not @ext==\"bat\" del @file"

但上述情况非常缓慢,输入确实很多。

以下内容更简单,更快捷。

@echo off
for /f "delims=" %%F in ('dir /b /a-d ^| findstr /vile ".sdb .sbk .log .bat"') do del "%%F"

答案 1 :(得分:6)

如果您有ROBOCOPY

@ECHO OFF
MKDIR temporary_pit
ROBOCOPY . temporary_pit /XF *.sdb *.sbk *.log *.bat /MOV >NUL
RMDIR /S /Q temporary_pit

也就是说,您正在创建一个临时子目录,将要删除的文件移动到它(这很快,因为目标目录位于同一驱动器上,只重定位文件名,而不是文件的内容),然后删除子目录。

答案 2 :(得分:4)

此外,你可以这样做:

@echo off
attrib -r -s *.*
attrib +r +s *.sdb
attrib +r +s *.sbk
attrib +r +s *.log
attrib +r +s *.bat
del *.* /S /Q
attrib -r -s *.sdb
attrib -r -s *.sbk
attrib -r -s *.log
attrib -r -s *.bat

- 马里奥

答案 3 :(得分:3)

@echo off
setlocal EnableDelayedExpansion
set exclude=.log.sdb.sdk.bat.
for %%f in (*.*) do (
   if /I "%exclude%" == "!exclude:%%~Xf.=!" del "%%f"
)

答案 4 :(得分:1)

forfiles /s /c "cmd /c (if NOT @ext==\"dqy\" del /s /q @path)" /D -14

这就像我可以获得这个脚本一样简单。他们希望保留宏文件(.dqy),但递归删除超过14天的所有其他内容。

在当前目录中运行(测试时要小心)。

答案 5 :(得分:0)

我遇到了这个主题,搜索了一种删除病毒创建的文件的方法。 没有解决方案真的对我有用,所以我想出了如何从命令行做到这一点。我只需要保留2个扩展名(邮件存档)。 这就是诀窍:

for /R %f in (*) do if not %~xf==.ex1 if not %~xf==*.ex2 del "%f"

我使用/ R来递归工作:查看所有子文件夹。 %~xf仅查看扩展名(由于某种原因,没有它就没有工作)。 我使用引号"%f"在delete命令中用空格覆盖windows长名称(特别是在文件夹名称中)。 另外由于某种原因,在==之前添加空格并且在==时出现错误。