Windowsbatch file – 在variables值中使用感叹号而不禁用延迟扩展

我有一个批处理脚本,它用一个用户inputstringreplace源文本文件中出现的多个源string。
为此,我在这里使用这个答案稍微更正的版本: 如何在Windowsbatch file中replace子string
(这不是被接受的答案,被接受的答案确实会改变源文件!)但是我只能解决一点“为每一行增加一个空格”-bug,而不是无法使用的主要问题源文件内有感叹号!

对于这个剩余的问题,我研究了一些,例如发现(并尝试了这些主题的build议):
– batch file中不断删除感叹号
– Windows批处理 – 延迟扩展删除感叹号
可悲的是,这些问题的解决scheme(暂时禁用“延迟扩展”)并不适用于我,因为我的脚本中只有一行需要“延迟扩展”,并且必须用可能的感叹号处理variables值!

这是线路
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
这可以在我的第一个链接后的上下文中看到。
作为一个简短的解释:这条线需要延迟扩展function,因为它驻留在一个for-block中的if-else-block中。 另一方面,variables“string”的值可能包含感叹号,因为它会逐行扫描源文件。

有没有人有一个想法,我可以解决这个问题?

编辑:
根据第一个注释,我试图启用延迟扩展只为主循环的必要部分(只有在需要访问修改的variables内容,使用“!” – 操作符)。 整个主循环现在看起来像这样:

 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. 很慢,可能会失败。
echo !variable! 当错误的内容在variable失败

所以我们结束了

 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(与任何内容安全工作,这看起来很奇怪,但目前没有一方知道。

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