通过 Windows 批处理文件读取行时避免插值



我想使用一个简单的Windows Batch文件进行文本搜索并在许多文件中替换。我的问题是:我不知道从可能包含特殊变量/字符的目标文件中读取行时如何避免内插变量。

例如,对于包含以下行(包括 !time!^^!)的目标文件 test.txt:

bbb aaaa bbb
!time!
bbb
^^!

对于这样的批处理文件:

@echo off
setlocal EnableDelayedExpansion
set SEARCH=a
set REPLACE=x
set FILE=test.txt
for /f "delims=" %%A in (%FILE%) DO (
  set line=%%A
  set line=!line:%SEARCH%=%REPLACE%!
  echo !line!
)

我得到以下输出:

bbb xxxx bbb
18:51:27.00
bbb
^

但我想要这个输出(保留!time!^^!):

bbb xxxx bbb
!time!
bbb
^^!

有什么技巧可以避免插值,同时仍然使用简单的 Windows 批处理脚本?

读取过程中未出现问题。当您尝试展开%%A的值并启用了延迟扩展时,会发生这种情况。这是一个问题,因为延迟扩展发生在 FOR 变量扩展之后。解决方案是根据需要打开和关闭延迟扩展。

@echo off
setlocal DisableDelayedExpansion
set SEARCH=a
set REPLACE=x
set FILE=test.txt
for /f "delims=" %%A in (%FILE%) DO (
  set line=%%A
  setlocal enableDelayedExpansion
  set line=!line:%SEARCH%=%REPLACE%!
  echo !line!
  endlocal
)

最新更新