【问题标题】:How to delete specific hidden sub folders recursively with batch如何使用批处理递归删除特定的隐藏子文件夹
【发布时间】:2015-11-04 07:51:18
【问题描述】:

一个坏程序在每个子目录中留下了几个“.data”隐藏文件夹。

到目前为止,我已经尝试过,但它不起作用......

RD /ah /s /q "D:\This Folder\.data"

我有很多文件夹和子文件夹,每个文件夹都有一个“.data”隐藏文件夹,我想删除它。如果有帮助,我想删除所有隐藏文件夹,因为它们都是“.data”。

【问题讨论】:

    标签: batch-file directory hidden subdirectory


    【解决方案1】:
    @echo off
        setlocal enableextensions disabledelayedexpansion
        for /f "delims= eol=" %%a in ('
            dir /adh /s /b 2^>nul 
        ') do if /i "%%~nxa"==".data" echo rd /s /q "%%~fa"
    

    这将执行 dir 命令以检索裸格式 (/b) 的隐藏目录 (/ahd) 的递归 (/s) 列表。此列表由for /f 命令处理,该命令将检查每个匹配项是否为.data 文件夹。如果符合条件,则删除文件夹及其内容。

    注意 rd 命令仅回显到控制台。如果输出正确,删除echo 命令。

    【讨论】:

    • 为什么我们需要setlocal enableextensions disabledelayedexpansion
    • @MichaelS,在禁用扩展的情况下,for /f 无法识别。虽然通常的配置是默认启用它们,但我发现它已被更改的情况。启用延迟扩展(是的,通常的配置被禁用,但并非总是如此)代码可能会遇到包含感叹号的路径问题。并且这两个参数都由setlocal 命令控制。所以,为了防止出现问题,我习惯于包含运行代码所需的精确配置的声明。
    • @MCND,我建议也使用eol=| 选项以避免以; 开头的路径出现问题(一般来说)...
    • @aschipfl,我的代码使用:: 作为驱动器参考。虽然在现实世界中我从未见过dir /s /b 命令返回;: 驱动器,但我不得不承认它可以做到,所以,好吧,我会改变它。但是管道字符也有同样的问题
    • @MCND,我知道,我的意思只是笼统地说 ;-) 在您的编辑中,您将 " 定义为分隔符(eol 始终使用字符。在 = 之后并且没有关心其他任何事情......),但这是一个禁止的字符。对于路径无论如何...
    【解决方案2】:
    @ECHO OFF
    for /f "tokens=*" %%F in ('dir /s /b /o:n /adh') do (
        if "%%~nxF"==".data" rd /s /q "%%F"
    )
    

    dir /s /b /o:n /adh 为您提供所有文件夹和子文件夹跳过文件。 for /f 遍历所有这些文件夹。 %%~nxF 从整个路径中提取最后一个文件夹名称,以便我们检查它是否是 .data。如果是这种情况,rd /s /q %%F 会删除该文件夹。

    【讨论】:

    • 您需要"delims=""tokens=*" 子句来防止包含空格的路径出现问题,因为默认情况下for /f 可替换参数只会检索第一个空格/制表符分隔的标记。与在if 命令中使用引号的方式相同,rd 命令中的文件夹引用也需要引号以防止出现空格或特殊字符问题。
    【解决方案3】:

    读一下当你输入 / 时你得到了什么?那么:

    使用 /d

    FOR /D %variable IN (set) DO command [command-parameters]
    
        If set contains wildcards, then specifies to match against directory
        names instead of file names.
    

    和/r一起切换

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    
    Walks the directory tree rooted at [drive:]path, executing the FOR
    statement in each directory of the tree.  If no directory
    specification is specified after /R then the current directory is
    assumed.  If set is just a single period (.) character then it
    will just enumerate the directory tree.
    

    递归扫描文件夹

    for /d /r . %%a in (data*) do rd /s /q "%%a"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2011-12-25
      • 2012-11-19
      • 1970-01-01
      • 2021-04-06
      相关资源
      最近更新 更多