0

我需要批量删除名称以数字开头的目录(和子目录)列表。

我的树是这样的:

|- root
    |--event=aaa
        |--photo
            |--123 
                |--44
                    |--23
                |--89
        |--otherdir
    |--event=bbb
        |--photo
            |--432 
                |--67
                    |--12
                |--32
        |--otherdir

我找到了这个工作示例:http ://www.dostips.com/forum/viewtopic.php?f=3&t=1496

这就是我写的

@ECHO OFF
SET path=\\mypath
SET dir=\parentDir\

:: loop on event=* folders
FOR /D /R %path%%dir% %%K IN ("*event*") DO (
    :: if an event contains photos ..
    IF EXIST %%K\photo (
        ECHO %%K

        :: loop on dir inside photo folder with a numeric name
        PUSHD %%K\photo ||goto :eof
        FOR /f "delims=" %%a IN ('dir /ad /b /s ^|findstr /rc:"\\[0-9]"') DO (
            IF EXIST %%~a (
                RD /s /q "%%~a"
            )
        )
        POPD
    ) ELSE (
        ECHO.%%K /photo does not exists
    )
)
ECHO.completed
PAUSE

我发现的唯一问题是执行似乎在最后一个 /event=xxx 文件夹时冻结,并且需要很长时间才能 ECHO 最后一行(“完成”)。我不明白为什么..有什么想法吗?

非常感谢

4

2 回答 2

0
@ECHO OFF
SETLOCAL
SET mypath=.
SET dir=\parentdir\

FOR /f "delims=" %%i IN ( 
 ' dir /ad /s /b "%mypath%%dir%" ^|findstr /r "\\.*event.*\\photo\\[0-9].*" ' ) DO (
 IF EXIST "%%i" ECHO RD /s /q %%i
)

这应该按照您的要求进行 - 请注意。

我已经更改了变量名称。PATH不是一个好名字,因为PATH它是操作系统搜索可执行文件的目录序列。

我还更改了值以适合我的系统。

我添加了一个ECHO关键字,而不是任意删除目标目录——以防万一出现拼写错误——让您有机会首先进行验证。这ECHO将需要删除以激活删除功能。

findstr则表达式是\(需要额外的\作为转义)任意数量的任何字符,event任意数量的任意字符\photo\,,一个数字,然后是任意数量的任意字符。

另请注意,"broken label"注释 ( ::) 的形式不应在循环中使用。虽然它(和标签)在 W7 中的循环中工作(可能是后来的),但它在一些早期的 Windows 版本中终止了循环,而REM适用于所有版本。

于 2013-06-06T12:24:51.143 回答
0

你可以试试这个。它将删除* event *文件夹下名称中只有数字的每个文件夹。

目前,它会在仅列出将要删除的子目录集之后在每个主文件夹上暂停,并且没有破坏性。如果命令看起来正确,则删除echopause以激活 RD 命令以实际删除文件夹。

@echo off
for /f "delims=" %%a in (' dir "*event*" /ad /b ') do (
  for /f "delims=" %%b in (' dir "%%a" /ad /b /s ') do (
       for /f "delims=0123456789" %%c in ("A%%~nxb") do (
        if "%%c"=="A" if exist "%%b\" echo rd /s/q "%%b" 
     )
  )
  pause
)
于 2013-06-06T10:33:07.410 回答