使用windows批处理文件更改XML文件中的标记数据

使用windows批处理文件更改XML文件中的标记数据,xml,windows,batch-file,Xml,Windows,Batch File,我有一个XML文件,其中有几个标记,我正试图用批处理脚本更改其中一个标记的内容 xml文件的一个示例是: <ConfigurationData> <ReportsFolder>\Reports</ReportsFolder> <Helpfolder>\Help</HelpFolder> <InstallationType>Terminal</InstallationType> <LicenseFolder&

我有一个XML文件,其中有几个标记,我正试图用批处理脚本更改其中一个标记的内容

xml文件的一个示例是:

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

\报告
\帮助
终点站
..\许可证
我正在尝试将
之间的数据更改为我选择的另一个变量。我想我需要某种For循环来找到xml文件的那一部分,但我不知道如何编辑这一部分。

@echo off
@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
setlocal EnableDelayedExpansion 设置另一个变量=新值 (对于(theFile.xml)中的/F“delims=“%%a)do( 设置“行=%%a” 设置“换行符=!行:安装类型>=!” 如果“!换行!”neq“!换行!”( 设置“换行=%anotherVariable%” ) 回声!新线! ))>newFile.xml
使用示例数据输出:

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

\报告
\帮助
新价值
..\许可证
GNU
sed”/InstallationType/s/>[^您真的应该使用专门为处理XML而设计的工具

但在紧要关头,您可以使用任何可以执行regex搜索和替换的工具来执行一个简单的解决方案,该解决方案可以按照您的布局处理文件,但可能会失败,因为逻辑上等效的XML文件已经重新安排了物理布局

我喜欢使用我编写的混合JScript/batch实用程序,通过批处理脚本来操作文本文件。从XP开始,该脚本将在任何本机Windows计算机上运行,并且不需要安装任何第三方可执行文件。单击链接以获取脚本代码和更详细的说明

使用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"
setlocal enableDelayedExpansion
设置“newValue=myNewValue”
键入“fileName.xml”| repl“()()”$1!newValue!$2“>fileName.xml.new
移动/y“fileName.xml.new”fileName.xml

replicate of请检查其中的解决方案不完全正确。该问题中的所有答案都是“蛮力”"查找并替换特定字符串的所有实例。在我的问题中,我只想在两个XML标记之间更改数据,而我不一定知道原始数据会是什么。您是否无法访问能够正确操作XML的工具?例如编程语言,甚至VBSCRIPT?嗯,这肯定很接近了。它得到了一个e错误,表示进程无法访问该文件,因为它正被另一个进程使用,并且该文件被屏蔽。但是,我以任何其他方式编辑该文件都没有问题。该错误与批处理代码没有任何关系。可能您在Batc的同时在编辑器或其他程序中打开了输入或输出.xml文件h file run?这是我检查的第一件事。我尝试在以前未打开的单独的xml文件上运行它,但收到了相同的错误。在运行批处理文件之前执行此行:
键入file.xml>newFile.xml
;再次检查批处理文件中使用的名称与文件的真实名称。如果没有如果不工作,请关闭MS-DOS命令窗口,然后再次打开它…@JohnSaunders-因此我警告OP应该使用XML感知工具,并且使用正则表达式“解决方案”如果输入的是有效的、重新排列的XML文件,则可能会失败。但是,您仍然认为答案应该是-1,因为它显示了如何使用正则表达式来操纵OP的布局?尽管有明确的规定,如果输入的XML物理布局发生变化,它将无法可靠地工作?这似乎是苛刻和武断的,特别是考虑到Aacini的答案没有您的支持警告,尽管它比正则表达式“解决方案”更简单。至少你在评论中解释了你的理由;谢谢你的礼貌。@JohnSaunders:我查看了你的个人资料,发现你在4860个总答案中只在批处理文件标记主题上发布了一个答案,这是针对批处理解决方案的否定答案。我礼貌地鼓励你将答案和评论保留在你的个人资料中专业领域,这当然不是批处理文件…非常感谢。
<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New Value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>
setlocal enableDelayedExpansion
set "newValue=myNewValue"
type "fileName.xml"|repl "(<InstallationType>).*(</InstallationType>)" "$1!newValue!$2" >fileName.xml.new
move /y "fileName.xml.new" "fileName.xml"