批量达到最大 setlocal 递归级别

Maximum setlocal recursion level reached in batch

任务是用 html 文件集合中的一些新路径替换参考路径。我为此使用了下面的代码,它抛出了最大设置局部递归级别达到错误,

@echo off
for /r ".\" %%f in (\html\*.htm) do (
    SETLOCAL
    call :SUB ../icons ../../icons "%%f">"%%f_new" 

    del "%%f"
)
for /r ".\" %%f in (*.htm_new) do rename "%%f" "*.htm"
ENDLOCAL
exit /b

:SUB
call
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B"
    call set "line=echo.%%line:%~1=%~2%%"
    for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
)
exit /b

谁能告诉我如何解决这个错误?

提前致谢..

首先,您应该确定您的代码。
括号不平衡,左括号多于右括号。

你调用了一个 label/function ,它是你第一个 FOR /r 循环的一部分,它永远不会工作。

也许这就是你想要的(但我什至无法猜到你用你的代码尝试了什么)

@echo off
for /r ".\" %%f in (\html\*.htm) do (
    SETLOCAL
    call :SUB ../icons ../../icons "%%f">"%%f_new" 
    del "%%f"
    ENDLOCAL
)
for /r ".\" %%f in (*.htm_new) do rename "%%f" "*.htm"
exit /b

:SUB
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
        set "line=%%B"
        call set "line=echo.%%line:%~1=%~2%%"
        for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
)
exit /b

编辑代码后:
setlocal/endlocal 应该在同一个块中,在您的情况下,您为每个 html 文件调用 SETLOCAL,但只调用一次 ENDLOCAL。 但是每个 SETLOCAL 需要一个 ENDLOCAL

评论后:
您尝试使用百分比扩展修改 html 文件,但在许多情况下会失败,因为处理 html 文件中的特殊字符(如 <>&|.

很棘手)

顺便说一句。当一行以 ].

开头时,您的 For /f 循环读取文件内容将失败

这个应该有用

:SUB
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
setlocal DisableDelayedExpansion
for /f "tokens=* delims=" %%A in ('"type %3|find /n /v """') do (
        set "line=%%B"        
        setlocal EnableDelayedExpansion
        set "line=!line:%~1=%~2!"
        set "line=!line:*]=!"
        echo(!line!
        endlocal
)
exit /b

但是使用来自 dbenham

的 repl.bat 工具有一个更简单的解决方案