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

时间:2013-06-06 07:51:38

标签: batch-file dos

我需要使用批处理删除名称以数字开头的目录列表(和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 %%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最后一行(“已完成”)需要相当长的时间。我不明白为什么......任何想法?

非常感谢

2 个答案:

答案 0 :(得分:0)

你可以试试这个。它将删除名称中仅包含数字的 * 事件 * 文件夹下的每个文件夹。

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

答案 1 :(得分: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,任意数量的任何字符,{ {1}},一个数字,然后是任意数量的任何字符。

另请注意,\photo\形式的评论("broken label")不应在循环中使用。虽然它(和标签)在W7的循环中运行(并且可能是稍后的),但它会在某些早期Windows版本中终止循环,而::适用于所有版本。