如何使用EnabledDelayedExapnsion输出感叹号?

Jer*_*ler 1 shell batch-file

我正在编辑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"调用,我认为这会搞乱我的行变量.有什么想法吗?

jeb*_*jeb 5

您无法以这种方式输出感叹号.

感叹号是内容的一部分,%%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 %%atext,然后切换到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)