批处理文件,文件夹上的循环似乎冻结



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

我的树是这样的:

|- 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 %%Kphoto (
        ECHO %%K
        :: loop on dir inside photo folder with a numeric name
        PUSHD %%Kphoto ||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 文件夹时,执行似乎冻结了,并且需要很长时间才能回显最后一行("已完成"(。我不明白为什么..有什么想法吗?

非常感谢

你可以

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

目前,它将在每个主文件夹上暂停,仅列出要删除的子目录集,并且不会造成破坏性。 如果命令看起来正确,则删除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
)
@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适用于所有版本。

最新更新