通过延迟扩展来逃避感叹号

Escaping exclamation marks with delayed expansion

我有一个批处理文件,用于搜索一段文本并将其替换为另一段。它有效,但发生的事情是,当创建 'new' 文件时,感叹号后的所有内容都被删除。

原文件

Hello! I have some cheese

才变成

Hello

尽管我尝试替换的文本没问题。

我明白,由于我使用的是延迟扩展,所以我需要以某种方式使用 ^^! 转义感叹号,但不知道在哪里可以做到这一点。在 echo 添加它只是从字面上回应 ^^!

如有任何帮助,我们将不胜感激。

set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed\%SOURCE%"


 setlocal enableDelayedExpansion
(
   for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
      set "line=%%b"
      if defined line set "line=!line:%replace%=%replaced%!"
      echo(!line!
   )
) > %target%

endlocal

为避免感叹号丢失,仅在真正需要时才启用延迟扩展,仅在禁用延迟扩展时才扩展普通 % 变量和 for 元变量:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"

set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed\%source%"

(
    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
        set "line=%%b"
        setlocal EnableDelayedExpansion
        if defined line set "line=!line:%replace%=%replaced%!"
        echo(!line!
        endlocal
    )
) > "%target%"

endlocal

如果变量 replacereplaced 包含 ! 符号,此代码仍然会导致问题,因为它们是百分比扩展的。