2

好的,所以我有两个文件,其中包含除一行之外的相同文本,我正在做的是将文件中的不同行复制%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

谢谢你的帮助。

4

1 回答 1

3

!如果在启用延迟扩展时对其进行扩展,包含未转义的 FOR 变量内容将始终被破坏。这是因为延迟变量扩展发生在 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

如果您知道它已被禁用,则无需在循环外显式禁用延迟扩展。

于 2014-05-23T03:38:54.103 回答