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

时间:2013-09-09 23:10:23

标签: windows batch-file replace string-interpolation

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

例如,对于包含这些行(包括!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批处理脚本?

1 个答案:

答案 0 :(得分:0)

在阅读过程中不会出现此问题。当您尝试扩展%%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
)