批量达到的最大setlocal递归级别

时间:2015-01-08 13:35:28

标签: batch-file

任务是用html文件集合中的一些新路径替换引用路径。我使用下面的代码,它会抛出最大的setlocal递归级别达到错误,

@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

任何人都可以告诉我如何解决此错误?

提前致谢..

1 个答案:

答案 0 :(得分:3)

首先,您应该识别您的代码 括号不平衡,打开比闭括号更多。

你调用一个标签/函数,它是你的第一个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工具有一个更简单的解决方案