好的,所以我有两个文件,其中包含除一行之外的相同文本,我正在做的是将不同行从 %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
感谢您的帮助。
最佳答案
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
如果您知道循环外的延迟扩展已被禁用,则无需显式禁用它。
关于batch-file - 批处理文件延迟扩展逐行包含感叹号的文件副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23817245/