11

我正在尝试在 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

我怎样才能让它工作?

4

6 回答 6

13
  • 内部引号必须用\
  • 你可能想要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"
于 2012-02-24T03:45:17.647 回答
10

如果ROBOCOPY您可以使用:

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

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

于 2012-02-24T12:56:37.950 回答
5

此外,您可以执行以下操作:

@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

——马里奥

于 2012-02-24T19:19:40.670 回答
3
@echo off
setlocal EnableDelayedExpansion
set exclude=.log.sdb.sdk.bat.
for %%f in (*.*) do (
   if /I "%exclude%" == "!exclude:%%~Xf.=!" del "%%f"
)
于 2012-02-24T04:02:24.970 回答
2
forfiles /s /c "cmd /c (if NOT @ext==\"dqy\" del /s /q @path)" /D -14

这就像我能得到这个脚本一样简单。他们想保留宏文件 (.dqy),但递归删除超过 14 天的所有其他文件。

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

于 2016-03-23T04:26:03.033 回答
-1

我遇到了这个主题,寻找一种删除由病毒创建的数百个文件的方法。没有一个解决方案真的对我有用,所以我想出了如何从命令行来做。我只需要保留 2 个扩展名(邮件存档)。这成功了:

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

我使用 /R 进行递归工作:查看所有子文件夹。%~xf 只查看扩展名(由于某种原因,没有它就无法工作)。我在删除命令中使用引号“%f”来用空格覆盖 Windows 长名称(尤其是在文件夹名称中)。同样由于某种原因,在 == 之前添加空格并添加错误会导致错误。

于 2016-05-13T10:22:21.457 回答