加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows批处理文件 – 在变量值中使用感叹号而不禁用延迟扩展

发布时间:2020-12-14 05:43:53 所属栏目:Windows 来源:网络整理
导读:我有一个批处理脚本,用一个用户输入字符串替换源文本文件中几次出现的源字符串. 为此,我在这里使用了这个答案的略微修正版本: How to replace substrings in windows batch file (这不是公认的答案,被接受的答案确实更改了源文件!)但我只能解决一点“为每
我有一个批处理脚本,用一个用户输入字符串替换源文本文件中几次出现的源字符串.
为此,我在这里使用了这个答案的略微修正版本: How to replace substrings in windows batch file
(这不是公认的答案,被接受的答案确实更改了源文件!)但我只能解决一点“为每一行增加一个空间”-bug,而不是无法使用的主要问题内有感叹号的源文件!

对于这个剩下的问题,我研究了一些问题,例如发现(并尝试了以下建议)这些主题:
– exclamation point being removed constantly in batch file
– Windows batch – Delayed expansion removes exclamation mark
遗憾的是,这些问题的解决方案(暂时禁用“延迟扩展”)不适用于我,因为我的脚本中有一行需要“延迟扩展”并且必须处理具有潜在感叹号的变量值!

这就是这条线
SET modified =!string:%SEARCHTEXT%=%REPLACETEXT%!
这可以在我的第一个链接后的上下文中看到.
作为简短说明:该行需要延迟扩展才能起作用,因为它位于for-block中的if-else块内.另一方面,变量’string’的值可能包含感叹号,因为它逐行扫描源文件.

有人知道如何解决这个问题吗?

编辑:
根据第一条评论,我试图仅对主循环的必要部分启用延迟扩展(仅在需要访问修改后的变量内容时使用“!” – 运算符).整个主循环现在看起来像这样:

setlocal disabledelayedexpansion
    for /f "tokens=1,* delims=?" %%A in ('"findstr /n ^^ %INTEXTFILE%"') do (
      SET string=%%A
      setlocal enabledelayedexpansion
      for /f "delims=: tokens=1,*" %%A in ("!string!") do set "string=%%B"
      if  "!string!" == "" (
        echo.>>%OUTTEXTFILE%
      ) else (
        SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
        echo !modified!>> %OUTTEXTFILE%
      )
      endlocal
    )
    endlocal

可悲的是,这根本没有任何好处.这会产生与我为整个脚本启用延迟扩展时相同的输出文件.
我是否以错误的方式应用了给定的提示? (如果我进一步限制启用的范围,我只会在输出中得到空行或其他垃圾.)

解决方法

您编辑的代码中存在多个错误.

您正在使用findstr / n,这会在每行前面加上行号和冒号.
但是你应该避免将delim设置为?,因为即使它是一个不常见的角色,它仍然是一个可能的角色.

稍后您尝试删除行号和冒号

for /f "delims=: tokens=1,*" %%A in ("!string!") do set "string=%%B"

但是这也将删除输入文件的所有前导冒号并破坏所有感叹号,有时也会影响插入符号.

更好用

set "string=!string:*:=!" Remove all up to the first colon

然后你的两条回声线都很糟糕.
回声.很慢,可能会失败.
echo!变量!当错误的内容变量时失败

所以我们最终得到了

setlocal disabledelayedexpansion
for /f "tokens=* delims=" %%A in ('"findstr /n ^^ %INTEXTFILE%"') do (
  SET "string=%%A"
  setlocal EnableDelayedExpansion
  set "string=!string:*:=!"
  if defined string (
    SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
  )
    (echo(!modified!) >> %OUTTEXTFILE%
  endlocal
)
endlocal

回声线看起来有点奇怪,但它或多或少都很简单.
首先,我将一个正常的回显包含在括号块中,以确保我不会向文件中添加不需要的空格,因此我可以根据需要在右括号后添加任意数量的空格.

(echo Sample)    >> myOutputFile.txt

但是由于我们需要扩展具有未知内容的变量,因此这里不能使用普通的ECHO,请参阅此示例.

set "var1=/?"
set "var2=    "
set "var3=ON"
echo %var1%
echo %var2%
echo %var3%

但回声(对任何内容都是安全的.它看起来很奇怪,但目前还没有人知道.

所以我简单地将echo(!variable!)括在括号中(echo(!variable!),其中只有外括号构建块,第二个左括号是echo命令的一部分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读