【问题标题】:Delete files in a directory that do not match certain file extensions [closed]删除目录中与某些文件扩展名不匹配的文件[关闭]
【发布时间】:2012-11-07 10:14:14
【问题描述】:

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

逻辑是这样的:

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

以为这很简单,但我尝试了很多次都没有运气!

【问题讨论】:

  • 如果你想避免循环,如果等,将需要的文件移动到另一个目录。删除剩余的文件,然后移回“必需”文件。它看起来比 for loop+nested if 更具可扩展性。

标签: windows batch-file cmd


【解决方案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

【讨论】:

    【解决方案2】:

    这个问题几乎与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"
    

    【讨论】:

      【解决方案3】:

      与这个问题类似:How can I delete files that don't match a wildcard?

      FOR /R [directory] %%F IN (*.*) DO IF NOT "%%~xF" == ".[extension]" DEL /F /S "%%F"
      

      【讨论】:

        猜你喜欢
        • 2012-06-04
        • 2019-08-15
        • 1970-01-01
        • 2010-10-19
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多