我需要使用批处理删除名称以数字开头的目录列表(和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最后一行(“已完成”)需要相当长的时间。我不明白为什么......任何想法?
非常感谢
答案 0 :(得分:0)
你可以试试这个。它将删除名称中仅包含数字的 * 事件 * 文件夹下的每个文件夹。
目前,在仅列出将要删除的子目录集之后,它将在每个主文件夹上暂停,并且不具有破坏性。如果命令看起来正确,则删除echo
和pause
以激活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版本中终止循环,而::
适用于所有版本。