2

有人请帮助...哦,我将不胜感激。我有一个非常长的批处理文件,它运行良好,除了每次用户输入输入时,它都会替换所需文件中的字符串,但它正在删除文件中的 !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
4

1 回答 1

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 块,它更快,您不需要先删除文件。
我尝试将所有替换项移到一个块中,因此您只需要读取一次文件。

于 2012-10-25T05:28:56.437 回答