批量达到最大 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 工具有一个更简单的解决方案
任务是用 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 工具有一个更简单的解决方案