【问题标题】:Changing tag data in an XML file using windows batch file使用 Windows 批处理文件更改 XML 文件中的标记数据
【发布时间】:2026-01-07 17:15:01
【问题描述】:

我有一个包含多个标签的 XML 文件,我正在尝试使用批处理脚本更改其中一个标签的内容。

xml文件的一个例子是:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>Terminal</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>

我正在尝试将&lt;InstallationType&gt;&lt;/InstallationType&gt; 之间的数据更改为我选择的另一个变量。我想我需要某种 For 循环来查找 xml 文件的那部分,但我不知道如何只编辑那个部分。

【问题讨论】:

  • *.com/questions/60034/… 的重复请查看那里的解决方案
  • 不完全是。该问题中的所有答案都是针对特定字符串的所有实例的“蛮力”查找和替换。在我的问题中,我只是想在两个 XML 标签之间更改数据,我不一定知道最初会有什么数据。
  • 您无法使用可以正确操作 XML 的工具吗?像编程语言,甚至是 VBSCRIPT?

标签: xml windows batch-file


【解决方案1】:
@echo off
setlocal EnableDelayedExpansion

set anotherVariable=New value

(for /F "delims=" %%a in (theFile.xml) do (
   set "line=%%a"
   set "newLine=!line:InstallationType>=!"
   if "!newLine!" neq "!line!" (
      set "newLine=<InstallationType>%anotherVariable%</InstallationType>"
   )
   echo !newLine!
)) > newFile.xml

使用您的示例数据输出:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>

【讨论】:

  • 嗯,这肯定是越来越接近了。它收到一个错误,表明该进程无法访问该文件,因为它正在被另一个进程使用,并且该文件被空白。但是,以任何其他方式编辑文件都没有问题。
  • 该错误与批处理代码没有任何关系。也许您在批处理文件运行的同时在编辑器或其他程序中打开了输入或输出 .xml 文件?
  • 这是我检查的第一件事。我也尝试在之前未打开的单独 xml 文件上运行它,但我收到了同样的错误。
  • 在运行批处理文件之前执行这一行:type theFile.xml &gt; newFile.xml;仔细检查您在批处理文件中使用的名称与文件的真实名称。如果这不起作用,请关闭 MS-DOS 命令窗口并再次打开它...
【解决方案2】:

GNU sed

sed "/InstallationType/s/>[^<]*</>New Value</" file.xml

..输出:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New Value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>

【讨论】:

    【解决方案3】:

    您确实应该使用专门设计用于操作 XML 的工具。

    但是在紧要关头,您可以使用任何可以进行正则表达式搜索和替换的工具来执行一个简单的解决方案,该解决方案可以按照您的布局处理文件,但可能会因逻辑等效的 XML 文件而失败物理布局重新排列。

    我喜欢使用我编写的名为 REPL.BAT 的混合 JScript/批处理实用程序通过批处理脚本操作文本文件。该脚本将从 XP 开始在任何本机 Windows 机器上运行,并且不需要安装任何第 3 方可执行文件。点击链接获取脚本代码和更详尽的描述。

    使用 REPL.BAT,一个快速高效但简单的解决方案很简单:

    setlocal enableDelayedExpansion
    set "newValue=myNewValue"
    type "fileName.xml"|repl "(<InstallationType>).*(</InstallationType>)" "$1!newValue!$2" >fileName.xml.new
    move /y "fileName.xml.new" "fileName.xml"
    

    【讨论】:

    • @JohnSaunders - 所以我警告 OP 应该使用 XML 感知工具,并且正则表达式“解决方案”可能会因有效的、重新排列的 XML 文件输入而失败。然而,您仍然认为答案值得 -1 来展示如何使用正则表达式来操纵 OP 的布局?即使它明确指出如果输入 XML 物理布局发生变化,它将无法可靠地工作?这似乎是苛刻和武断的,特别是考虑到 Aacini 的回答没有受到您的警告,即使它比正则表达式“解决方案”更加 XML 天真。至少你在评论中解释了你的理由;谢谢你的好意。
    • @JohnSaunders:我查看了您的个人资料,我意识到您在 4,860 个总答案中只发布了一个关于批处理文件标签主题的答案,这是对批处理解决方案的否定回答。我有礼貌地鼓励您将答案和 cmets 保留在您的专业领域中,这当然不是批处理文件...非常感谢。
    最近更新 更多