【问题标题】:Need your assistance with Windows cmd shell script在 Windows cmd shell 脚本方面需要您的帮助
【发布时间】:2025-12-04 08:35:01
【问题描述】:

我有以下脚本从 ROOT 目录中删除所有子目录,并删除 ROOT 目录中除 *.bat 文件之外的所有文件。

pause
FOR /R C:\Temp\ %%F IN (*.*) DO IF NOT "%%~xF" == ".bat" DEL /F /S "%%F"
for /d %%i in ("c:\Temp\*") do rmdir /s /q "%%i"
pause

帮我改进脚本,它还可以扫描ROOT子目录中的文件*.bat并删除所有具有其他扩展名的文件。

【问题讨论】:

  • 那么,需要删除什么?只有文件还是子文件夹?
  • 这个脚本应该删除ROOT子目录中的所有文件,除了那些sob目录中的所有*.bat文件
  • 如果 ROOT 子目录之一不包含任何 *.bat 文件,则它也会删除
  • & 为什么它被标记在bash 下? (我现在取消标记它。)

标签: windows batch-file recursion cmd directory


【解决方案1】:

测试。如果控制台中显示的内容是需要执行的操作,请从保留 rmdirdel 命令的破坏性行中删除 echo 命令。

@echo off

    setlocal enableextensions

    set "root=c:\temp"

    rem For the %root% tree
    for /r "%root%" %%d in (.) do (

        rem Test for the presence of .bat files under directory 
        dir /s /b "%%~fd\*.bat" 2>nul | find /v "" > nul 
        if errorlevel 1 (

            rem If there is no .bat files under directory, remove directory
            echo(**** rmdir /s /q "%%~fd"

        ) else (

            rem There are bat files in directory or under it. Remove anything else in this directory
            for %%f in ("%%~fd\*") do if not "%%~xf"==".bat" echo(-------- del "%%~ff"

        )

    )

已编辑 - 适应 cmets - 如何调整代码以便处理多个根文件夹?取代码并将其转换为子程序,然后用相应的根调用它。遍历根目录列表

@echo off

    setlocal enableextensions

    for %%r in ("c:\temp" "c:\temp2" "c:\temp3") do call :processRoot %%r

    endlocal
    exit /b

:processRoot
    setlocal enableextensions disabledelayedexpansion

    set "root=%~1"

    rem For the %root% tree
    for /r "%root%" %%d in (.) do (

        rem Test for the presence of .bat files under directory 
        dir /a /s /b "%%~fd\*.bat" 2>nul | find /v "" > nul 
        if errorlevel 1 (

            rem If there is no .bat files under directory, remove directory
            echo(**** rmdir /s /q "%%~fd"

        ) else (

            rem There are bat files in directory or under it. Remove anything else in this directory
            for %%f in ("%%~fd\*") do if not "%%~xf"==".bat" echo(-------- del "%%~ff"

        )

    )
    endlocal
    goto :eof

【讨论】:

  • 太糟糕了,我不能投票
  • 脚本无法识别隐藏的 *.bat 文件并永久删除包含隐藏 *.bat 文件的目录。如何添加识别隐藏的 *.bat 文件?
  • 如何在这个脚本中创建多重根路径?
  • @MichaelT:已更新。也许不是更清洁的方式,但它不需要额外的测试。如果它适用于一个根,它“应该”适用于更多根。由于唯一改变的是初始变量,因此适应将其值从参数传递到子程序并保留其余代码。
最近更新 更多