powershell修改xml文件需先用[xml]加载为xmldocument对象,再用selectsinglenode/selectnodes定位节点并修改innertext或属性,最后调用save()保存;select-xml仅用于查询,其.node属性才可修改,且需手动保存;处理命名空间须声明namespacemanager;保存时save()会重排格式,如需保留原格式可用xmlwriter配置缩进。

PowerShell 修改 XML 文件中的值,核心是用 Select-Xml 定位节点,再通过 .NET 的 XML 对象模型(如 XmlNode 的 InnerText 或 SetAttribute())修改内容,最后保存回文件。它本身不直接修改,而是配合 Get-Content -AsByteStream(旧版)或更推荐的 [xml] 类型强制转换来操作。
用 [xml] 加载并修改节点值(最常用)
这是最直观、稳定的方式:把 XML 读成 .NET 的 XmlDocument 对象,用 XPath 查找节点,改值,再保存。
- 先用
[xml]$xml = Get-Content path.xml加载(自动解析,支持注释和命名空间) - 用
$xml.SelectSingleNode("//ElementName")或$xml.SelectNodes("//item[@id='123']")找节点 - 修改文本值:
$node.InnerText = "新内容" - 修改属性值:
$node.SetAttribute("attrName", "新值") - 保存:
$xml.Save("path.xml")(会保留原始格式,但缩进可能重排;如需美化可另加处理)
Select-Xml 的实际用途:只读查询 + 后续修改
Select-Xml 本质是“查”,返回 SelectXmlInfo 对象,其 .Node 属性才是可修改的 XmlNode。适合在复杂文档中精准定位后再改。
- 例如:修改所有
<status></status>值为active $nodes = Select-Xml -Path config.xml -XPath "//status"foreach ($n in $nodes) { $n.Node.InnerText = "active" }- ⚠️注意:
Select-Xml返回的是副本节点,改完不会自动写回原文件——你仍需用原始[xml]对象或重新加载保存
处理带命名空间的 XML
如果 XML 有 xmlns="http://example.com/ns",XPath 查询必须声明命名空间,否则查不到。
- 定义命名空间管理器:
$ns = @{ ns = "http://example.com/ns" } - 查节点:
$xml.SelectSingleNode("//ns:config", $ns) - 用
Select-Xml时传入:Select-Xml -Path file.xml -XPath "//ns:item" -Namespace $ns - 命名空间前缀(如
ns:)必须和$ns中的键一致
保存时保持原始格式(可选增强)
$xml.Save() 会输出紧凑 XML(无换行缩进)。若想接近原文格式:
- 用
$xml.OuterXml | Set-Content file.xml -Encoding UTF8(简单但丢失注释) - 更稳妥:用
System.Xml.XmlWriter配置缩进(适合对格式敏感的场景) - 小技巧:先备份原文件,改完对比差异,避免意外覆盖










