我正在编辑XML文件,大约前10行是注释。对于xml注释,格式为
<!-- COMMENT HERE -->
但是当使用我的代码时,它不会输出! mark,它搞砸了xml中的注释。据我所知,ENABLEDELAYEDEXPANSION这样做是因为它认为感叹号正在扩展变量。我怎么能让这个工作?
以下是我的代码
setlocal ENABLEDELAYEDEXPANSION
set line=0
FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
set /a line = !line!+1
if !line!==39 (echo REPLACED TEXT39>>%tempfile%
)else if(!line!==45 (echo REPLACED TEXT45>>%tempfile%
)else (echo %%a>>%tempfile%
))
EDIT1 基本上应该做的是按原样输出每一行,除非它是39行或45行。它可以工作,除了!评论中的标记不会输出,它们不再是评论。
EDIT2
set line=0
FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
setlocal ENABLEDELAYEDEXPANSION
set /a !line! +=1
echo !line!
if !line!==39 (
echo REPLACED TEXT39>>%tempfile%
endlocal
)else if !line!==45 (
echo REPLACED TEXT45>>%tempfile%
endlocal
)else (
endlocal
setlocal DISABLEDELAYEDEXPANSION
echo %%a>>%tempfile%
endlocal
))
这是我一直在使用的最新代码。它工作得最好,但现在的问题是变量“line”没有得到更新。我觉得这是因为“endlocal”。唯一的问题是我需要“endlocal”,否则我会收到错误
达到最大setlocal递归级别。
问题是,我需要在enableddelayedexpansion和disabledelayedexpansion之间切换,以便我的感叹号正确显示。但要做到这一点,我需要跟上“endlocal”调用,我认为这会搞乱我的行变量。有什么想法吗?
答案 0 :(得分:5)
您无法以这种方式输出感叹号。
感叹号是%%a
内容的一部分,但启用了延迟展开后,您无法访问它,因为它会在%%a
被显示后进行解析。
所以你需要暂时禁用延迟扩展。
临时禁用它的示例
setlocal ENABLEDELAYEDEXPANSION
set line=0
FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
set /a line = !line!+1
if !line!==39 (
echo REPLACED TEXT39>>%tempfile%
) else if !line!==45 (
echo REPLACED TEXT45>>%tempfile%
) else (
setlocal DisableDelayedExpansion
echo %%a>>%tempfile%
endlocal
)
)
或者你根本不使用它,那么你只需要让if line=42
部分工作
这使用模数为0的事实将产生错误(由2>nul
抑制)并且变量保持不变,在这种情况下它们保持未定义。
setlocal DisableDelayedExpansion
set line=0
FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
set /a line+=1
set "notLine39="
set /a "notLine39=1%%(line-39)" 2>nul
set "notLine45="
set /a "notLine45=1%%(line-45)" 2>nul
if not defined line39 (
echo REPLACED TEXT39>>%tempfile%
) else if not defined line45 (
echo REPLACED TEXT45>>%tempfile%
) else (
setlocal DisableDelayedExpansion
echo %%a>>%tempfile%
endlocal
)
)
修改:为已更改的问题添加了说明
这使用了SO: Batch files: How to read a file?中描述的切换延迟扩展技术
诀窍是在将%%a
转移到text
时进入disabledDelayedExpansion,然后切换到enabledDE并能够使用扩展语法。
但是在下一个循环开始之前不要忘记endlocal
。
setlocal DisableDelayedExpansion
set line=0
FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
set /a line+=1
set "text=%%a"
setlocal EnableDelayedExpansion
if !line!==39 (
echo REPLACED TEXT39>>%tempfile%
) else if !line!==45 (
echo REPLACED TEXT45>>%tempfile%
) else (
echo %%a>>%tempfile%
)
endlocal
)