我正在编辑XML文件,大约前10行是注释.并且对于xml注释在表单中
<!-- COMMENT HERE -->
Run Code Online (Sandbox Code Playgroud)
但是当使用我的代码时,它不会输出!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%
))
Run Code Online (Sandbox Code Playgroud)
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
))
Run Code Online (Sandbox Code Playgroud)
这是我一直在使用的最新代码.它工作得最好,但现在的问题是变量"line"没有得到更新.我觉得这是因为"endlocal".唯一的问题是我需要"endlocal",否则我会收到错误
达到最大setlocal递归级别.
问题是,我需要在enableddelayedexpansion和disabledelayedexpansion之间切换,以便我的感叹号正确显示.但要做到这一点,我需要跟上"endlocal"调用,我认为这会搞乱我的行变量.有什么想法吗?
您无法以这种方式输出感叹号.
感叹号是内容的一部分,%%a但启用延迟扩展时,您无法访问它,因为它将在%%aepanded 之后进行解析.
因此,您需要暂时禁用延迟扩展.
临时禁用它的示例
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
)
)
Run Code Online (Sandbox Code Playgroud)
或者你根本不使用它,那么你只需要使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
)
)
Run Code Online (Sandbox Code Playgroud)
编辑:添加了对已更改问题的说明
这使用了切换延迟扩展技术,如SO中所述:批处理文件:如何读取文件?
诀窍是在传输时处于disabledDelayedExpansion %%a中text,然后切换到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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |