如何使用EnabledDelayedExapnsion输出感叹号?

时间:2014-05-06 15:31:36

标签: shell batch-file

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

1 个答案:

答案 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
)