感叹号在批处理文件中不断被删除

Rob*_*ton 2 replace file batch-file find

有人请帮忙......哦,我会非常感激的.我有一个非常长的批处理文件,除了每次用户输入输入时,它都会替换所需文件中的字符串但它正在删除文件中的!s,因为它们是XML配置文件而导致问题,这些都被注释掉了需要留下的部分.除非有要求,否则我不会将整个代码放在这里,但是在坚果外壳中,用户进行某些输入,然后运行批处理文件...这里是一个文件代码的一部分....用户输入驱动器安装信和bdi服务器的名称.我希望用户输入替换%驱动器%和%bdi1%....它确实....但我不希望它替换已注释掉的部分...即::

<!-- Tcp message preamble and postamble are flags that mark the beginning and end of an HL7 message. turns into <-- Tcp message preamble and postamble are flags that mark the beginning and end of an HL7 message.
Run Code Online (Sandbox Code Playgroud)

注意没有!

这是我的代码...我需要做什么才能让它停止删除!我试着在这里看,我觉得我在Jeb的答案上很顺利,但我无法让它发挥作用.提前致谢

if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:server_name=%server%!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config



if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:bdi_name=%bdi1%!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config



if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:share_name=%share%$!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config


if exist newfile.txt del newfile.txt
for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
set str=%%a
set str=!str:drive_bdi=%drive%!
echo !str! >> newfile.txt
)
del importer.config
rename newfile.txt importer.config
Run Code Online (Sandbox Code Playgroud)

jeb*_*jeb 7

这是延迟扩展和批处理解析器的影响.
如果禁用延迟扩展,则感叹号不会出现问题,但如果启用了解析器,解析器会认为它!是用于扩展变量,而当只有一个标记时,它将被删除.

所以解决方案是禁用延迟扩展,但是当你需要它时,你也必须启用它!

这可以通过在恰当的时刻简单地切换它来完成.

setlocal DisableDelayedExpansion
(
  for /F "usebackq delims=" %%a in ("%drive%:\mckesson\%bdi1%\importer.config") do (
    set "str=%%a"
    setlocal EnableDelayedExpansion
    set "str=!str:server_name=%server%!"
    set "str=!str:bdi_name=%bdi1%!"
    set "str=!str:share_name=%share%$!"
    set "str=!str:drive_bdi=%drive%!"
    echo(!str!
    endlocal
  )
) > newfile.txt
Run Code Online (Sandbox Code Playgroud)

我将重定向移动到完整的FOR-block,它更快,您不需要先删除该文件.
我尝试将所有替换项移动到一个块中,因此您只需要读取一次该文件.