Windows批处理文件删除除几个文件夹以外的所有文件

问题描述:

我正在编写一个.bat脚本来删除所有文件夹,但大致是五个预设文件夹。我所做的是创建一个for循环来处理每个文件夹,然后forloop通过IF语句检查文件夹的名称是否与字符串匹配,在这种情况下,它使用GOTO转到RD命令下面的行,以便删除被跳过。Windows批处理文件删除除几个文件夹以外的所有文件

但是,这结束了for循环,意味着每个文件夹,直到第一个异常被删除。

有没有更好的方法来实现我想要的,还是有我的脚本调整?

@echo off 
echo Starting... 
for /d %%i in ("C:\demo\*") do (
    if "%%i" == "C:\demo\mark" goto skipdel 
    if "%%i" == "C:\demo\pjotr" goto skipdel 
    if "%%i" == "C:\demo\jasper" goto skipdel 
    rd /s /q %%i 
    echo Deleted 
    :skipdel 
) 
echo Done. 
pause 
+3

转到打破了上下文。 – npocmaka

+0

,不要忘记,这在路径中有空格的系统文件中不起作用...如果你有如下路径:“C:/ Program Files(86x)/ ...”你必须使用:for/d% ('type“C:\ demo \ *”')do( –

未测试

@echo off 
echo Starting... 
for /d %%i in ("C:\demo\*") do (
    if not "%%i" == "C:\demo\mark" if not "%%i" == "C:\demo\pjotr" if not "%%i" == "C:\demo\jasper" (
     rd /s /q %%i 
     echo Deleted 
    ) 

) 

goto语句存在于命令。你可以用连续的IF来模拟和条件。您也可以使用一个内部的FOR循环迭代要跳过的文件夹。

+1

)我强烈建议使用switch'/ I'来比较路径/文件名,用'if'... – aschipfl

您可以使用正则表达式及其与'|'的组合选项来查找文件夹并删除内容。 使用这种方法,您只需在正则表达式部分[0-9a-z]中添加/删除字符串,将来没有太大问题,Ex使用正则表达式[mark | pjotr | jasper]。

下面就是该方法 -

FOR /f "tokens=*" %%G IN ('dir "c:\demo" /b /ad ^| findstr /i "^[0-9a-z][^/]*$"') DO ( 

REM Efficeint way to delete files and folder. Remove nul if you want verbose output 

del /f/s/q "c:\demo\%%G\*.*" > nul 
rmdir /s/q "c:\demo\%%G" > nul 

)