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

时间:2012-10-25 03:03:44

标签: file batch-file replace find

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

注意没有!

这是我的代码...我需要做些什么才能让它停止删除!我试着在这里看,我觉得我在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

1 个答案:

答案 0 :(得分: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

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