通过延迟扩展来逃避感叹号
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
如果变量 replace
和 replaced
包含 !
符号,此代码仍然会导致问题,因为它们是百分比扩展的。
我有一个批处理文件,用于搜索一段文本并将其替换为另一段。它有效,但发生的事情是,当创建 '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
如果变量 replace
和 replaced
包含 !
符号,此代码仍然会导致问题,因为它们是百分比扩展的。