【问题标题】:How to delete files and sub-folders from folders not starting with a specific name in a batch file?如何从批处理文件中不以特定名称开头的文件夹中删除文件和子文件夹?
【发布时间】:2016-08-22 22:01:06
【问题描述】:

我有一个D:\data 的目录,其中有许多文件夹,其中包含来自地图图层(D:\data\parks, D:\data\buildings, D:\data\rivers) 的数据。

我想删除所有这些子文件夹的内容,包括文件和子文件夹,“数据”中以名称'raster' 开头的任何文件夹除外,即

D:\data\raster_aerialimage.

我有一些代码删除了其中一个文件夹,但我需要遍历所有文件夹并仅指定不以“raster”开头的文件夹,如何附加此代码,或者我应该从全新的东西开始?

FOR /D %%p IN ("D:\data\parks\*.*") DO rmdir "%%p" /s /q

【问题讨论】:

    标签: batch-file batch-processing delete-file subdirectory


    【解决方案1】:

    我建议使用在所有较新的 Windows 版本中都可用的 robocopy.exe:

    @echo off
    set folder=D:\data
    set except=raster
    set "MT=%TEMP%\DelFolder_%RANDOM%"
    
    mkdir %MT%
    :: mirror an empty dir to a folder tree will delete it
    robocopy "%MT%" "%folder%" /MIR /XD %except%* /R:1 /W:1
    rmdir /S /Q "%MT%"
    

    注意%except%变量后面的通配符星号。

    它速度很快,并且可以处理很长的路径名。

    【讨论】:

    • 这似乎工作得很好——唯一的问题是它删除了未命名为 raster 的文件夹,我实际上只想删除文件夹的内容,而不是文件夹本身。
    【解决方案2】:

    您可以使用dir /A:Dfindstr 一起遍历所有目录,以仅返回那些不以raster 开头的目录。然后使用for /F循环解析输出:

    pushd "D:\data"
    if ErrorLevel 1 goto :EOF
    for /F "eol=| delims=" %%P in ('
        dir /B /A:D "*.*" ^| findstr /L /V /I /B /C:"raster"
    ') do (
        rmdir /S /Q "%%~fP"
    )
    popd
    

    【讨论】:

    • 谢谢@aschipfl - 我似乎收到错误'D:\>(rmdir /S /Q "airports") 系统找不到指定的文件。这似乎也发生在其他一些文件夹中。
    • 嗯...dir /A:D 应该只返回确实存在的目录...也许您对这些目录或某些子项没有足够的访问权限?如果您尝试使用dir /B /A:D-L "D:\data" 会怎样?
    • 我似乎得到了同样的信息。我已将数据移动到本地 C: 驱动器和 Z: 驱动器上,但出现相同的消息。我能够在所有三个驱动器上读写,所以有点神秘!
    • 有问题的目录的确切名称是什么?你的脚本中启用了delayed expansion 吗?
    • 问题不是因为它试图搜索文件而不是文件夹吗? (只需阅读消息“系统找不到指定的文件”,因为它们是我希望删除的文件夹)。