使用批处理脚本更新xml

使用批处理脚本更新xml,xml,windows,batch-file,Xml,Windows,Batch File,我有一个文件config.xml,其中包含: <option name="cfgFileVersion" value="18.0-1" /> <option name="inclLifecyclesFrom" value="B" /> <option name="modifyLifecyclesFrom" value="D" /> <option name="adaptDir" value="C:\work\adaptDir"/> <opti

我有一个文件config.xml,其中包含:

<option name="cfgFileVersion" value="18.0-1" />
<option name="inclLifecyclesFrom" value="B" />
<option name="modifyLifecyclesFrom" value="D" />
<option name="adaptDir" value="C:\work\adaptDir"/>
<option name="sourceDir" value="C:\extra\IMSCL1800500.000"/>

我需要替换同一配置文件中的

<option name="cfgFileVersion" value="18.0-1" />

与:


以及:


与:


以及:


与:



请提供帮助。

将XML和其他结构化标记解析为分层对象几乎总是比将其解析为简单文本更好。不幸的是,批处理语言没有提供对象或方法来以这种方式处理XML

但是,使用PowerShell脚本可以非常轻松地完成此任务

$fr=@{
“cfgFileVersion”=“18.0.2”
“adaptDir”=“新值1”
“sourceDir”=“新值2”
}
[xml]$xml=gc config.xml
$fr.Keys |%{
$xml.SelectSingleNode(//option[@name='$\u']”).setAttribute(“value”、$fr[$\u])
}
$xml.Save(“config.xml”)
应该使用.ps1扩展名保存。如果必须以.bat脚本的形式保存它,可以将其包含在.bat+PowerShell多语言包中,方法是将其插入顶部(在
$fr=
行之前),并使用.bat扩展名保存:


编辑:下面是一个完整的示例,演示如何批量分配变量值并在PowerShell中检索这些值


$fr=@{
“cfgFileVersion”=$env:cfgVer
“adaptDir”=$env:adaptDir
“sourceDir”=$env:sourceDir
}
[xml]$xml=gc config.xml
$fr.Keys |%{
$xml.SelectSingleNode(//option[@name='$\u']”).setAttribute(“value”、$fr[$\u])
}
$xml.Save(“config.xml”)
或者,如果您希望完全摆脱哈希表,而不是刮取批处理中定义的某种关联数组,也可以这样做


[xml]$xml=gc config.xml
gci环境:{$\.Name-匹配“^config\[(.+)\]$”}}{
$xml.SelectSingleNode(“//option[@name='$($matches[1])”)”)。value=$\ux.value
}
$xml.Save(“config.xml”)

将XML和其他结构化标记解析为分层对象几乎总是比将其解析为简单文本更好。不幸的是,批处理语言没有提供对象或方法来以这种方式处理XML

但是,使用PowerShell脚本可以非常轻松地完成此任务

$fr=@{
“cfgFileVersion”=“18.0.2”
“adaptDir”=“新值1”
“sourceDir”=“新值2”
}
[xml]$xml=gc config.xml
$fr.Keys |%{
$xml.SelectSingleNode(//option[@name='$\u']”).setAttribute(“value”、$fr[$\u])
}
$xml.Save(“config.xml”)
应该使用.ps1扩展名保存。如果必须以.bat脚本的形式保存它,可以将其包含在.bat+PowerShell多语言包中,方法是将其插入顶部(在
$fr=
行之前),并使用.bat扩展名保存:


编辑:下面是一个完整的示例,演示如何批量分配变量值并在PowerShell中检索这些值


$fr=@{
“cfgFileVersion”=$env:cfgVer
“adaptDir”=$env:adaptDir
“sourceDir”=$env:sourceDir
}
[xml]$xml=gc config.xml
$fr.Keys |%{
$xml.SelectSingleNode(//option[@name='$\u']”).setAttribute(“value”、$fr[$\u])
}
$xml.Save(“config.xml”)
或者,如果您希望完全摆脱哈希表,而不是刮取批处理中定义的某种关联数组,也可以这样做


[xml]$xml=gc config.xml
gci环境:{$\.Name-匹配“^config\[(.+)\]$”}}{
$xml.SelectSingleNode(“//option[@name='$($matches[1])”)”)。value=$\ux.value
}
$xml.Save(“config.xml”)

现在,在您告诉我们您想要什么之后:您的问题是什么?目前,你的帖子只不过是一个代码请求,这显然是离题的。请阅读并学习!顺便说一下,如果你真的有一个配置文件,为什么不手动编辑它呢?现在在你告诉我们你想要什么之后:你的问题是什么?目前,你的帖子只不过是一个代码请求,这显然是离题的。请阅读并学习!顺便说一下,如果你真的有一个配置文件,为什么不手动编辑它呢?嗨,非常感谢你的回复。但问题是,我只需要在.bat脚本中使用它。不在电源外壳中。因为新值1新值2是存储在变量%a%,%b%中的值。@MKMS所以包括polyglot内容。您可以使用
$env
范围从Powershell中直接引用批处理线程定义的环境变量<批量设置的代码>%a%在PowerShell中检索为
$env:a
%b%
变为
$env:b
%adaptidir%
变为
$env:adaptidir
,依此类推。请参见答案编辑。如果你能用我的答案来完成你的目标,请考虑将它标记为被接受。为了解释为什么这很重要。嗨,非常感谢你的回复。但问题是,我只需要在.bat脚本中使用它。不在电源外壳中。因为新值1新值2是存储在变量%a%,%b%中的值。@MKMS所以包括polyglot内容。您可以使用
$env
范围从Powershell中直接引用批处理线程定义的环境变量<批量设置的代码>%a%在PowerShell中检索为
$env:a
%b%
变为
$env:b
%adaptidir%
变为
$env:adaptidir
,依此类推。请参见答案编辑。如果你能用我的答案来完成你的目标,请考虑将它标记为被接受。来解释为什么这很重要。
<option name="cfgFileVersion" value="18.0.2" />
<option name="adaptDir" value="C:\work\adaptDir"/>
<option name="adaptDir" value="New Value 1"/>
<option name="sourceDir" value="C:\extra\IMSCL1800500.000"/>
<option name="sourceDir" value="New Value 2"/>