任务是用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
任何人都可以告诉我如何解决此错误?
提前致谢..
答案 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工具有一个更简单的解决方案