2012-11-07 111 views
1

我正在尝试编写一个简单的批处理文件,用于删除目录中的所有文件及其包含的子文件夹,其中不是与某些文件扩展名匹配。删除与某些文件扩展名不匹配的目录中的文件

逻辑是这样的:

GOTO directory 
delete !(.avi, .mkv, .mp4) 

以为这是很简单,但我已经没有运气试过多次!

+1

尝试http://superuser.com/ –

+0

如果你想避免循环,如果等等,移动所需的文件到另一个目录。删除剩余的文件,然后移回'必需的'文件。 它看起来比循环+嵌套if更具扩展性。 – anishsane

+0

[删除\ *。\ * *不包括一些扩展名]的可能重复(http://stackoverflow.com/questions/9424380/delete-excluding-some-extensions) – finnw

回答

1
@echo off 
for /r C:\test %%a in (*) do (
if not %%~xa==.avi (
    if not %%~xa==.mkv (
     if not %%~xa==.mp4 ( 
      del /f /q "%%a" 
     ) 
    ) 
) 
) 

只是重复if的对,你不想要删除的扩展。

这个答案将适用于几个扩展,但如果你有任何更多,你会找到更好的答案here

1

这个问题几乎是相同的Delete *.* excluding some extensions,除了要从子目录删除为好。前两个答案中的任何一种适应都应该起作用。

以下两种情况均假定您的批处理脚本不在要删除的文件夹层次结构中。

@echo off 
for /f %%F in ('dir /s /b /a-d "yourDirPath\*"^| findstr /vile ".avi, .mkv, .mp4"') do del "%%F" 

@echo off 
setlocal EnableDelayedExpansion 
set "exclude=.avi.mkv.mp4." 
for /r "yourDirPath" %%F in (*) do if /I "%exclude%" == "!exclude:%%~xF.=!" del "%%F" 


如果你的脚本是层次结构,则额外的IF语句将解决这个问题。

@echo off 
for /f %%F in ('dir /s /b /a-d "yourDirPath\*"^| findstr /vile ".avi, .mkv, .mp4"') do if "%%~fF" neq "%~f0" del "%%F" 

@echo off 
setlocal EnableDelayedExpansion 
set "exclude=.avi.mkv.mp4." 
for /r "yourDirPath" %%F in (*) do if /I "%exclude%" == "!exclude:%%~xF.=!" if "%%~fF" neq "%~f0" del "%%F" 
相关问题