batch-file - 批处理文件延迟扩展逐行包含感叹号的文件副本

标签 batch-file escaping echo delayedvariableexpansion

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

相关文章:

batch-file - 错误 : "|" was unexpected at this time batch script

php - 为什么 PHP 不打印 0 值?

linux - bash:如何在同一位置回显字符串

windows cmd - 解析文件,输出字符范围,查找唯一值

windows - 批处理 TAB 分隔符还会在 ECHO 后删除字符 T、A 和 B

batch-file - BAT文件: path of argument

PHP:像linux一样转义文件名

mysql - 替换 MySQL 5 表中的反斜杠似乎有效 : but how do I double check?

emacs - 如何转义组织模式链接内的特殊符号

PHP 回显不起作用