好的,所以我有两个文件包含相同的文本,但一行除外,我正在做的是将不同的行从%source%
文件复制到%target%
文件(在本质就是将整个文件逐行写入新文件)。我遇到的问题是偶尔源文件会有一个由!表示的内嵌注释!它不会转换为目标文件。我目前运行的代码如下:
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
goto :eof
为方便起见,源文件是一个简单的文本文件,目标文件也是如此。 尝试了其他几个“到处走走!”延迟扩展的问题但似乎找不到适合这种情况的一个,因为我不知道文件在哪里!会发生。我已经尝试将setlocal / endlocal移动到for循环中,但这似乎也不起作用。
%source%
文件中任何可能导致问题的给定行的格式为:
JARG 0.1000 1.2000
LINE 0.5000 1.0000 !This line tells us what is in the line
SMAP 0.0000 1.1100
感谢您的帮助。
答案 0 :(得分:3)
对于包含未转义!
的变量内容,如果在启用延迟扩展时展开,则始终会损坏。这是因为在FOR变量扩展之后发生了延迟变量扩展。
在FOR循环中使用!
的技巧是在循环内打开和关闭延迟扩展。当您不必担心跨迭代保留变量赋值时,这很容易,这正是您所拥有的情况。
setlocal disableDelayedExpansion
(
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
goto :eof
如果您知道它已被禁用,则无需在循环外明确禁用延迟扩展。