PowerShell脚本编辑XML后乱码,如何修改保存编码?
解决PowerShell编辑XML后保存的编码乱码问题
你遇到的乱码问题(比如出现​、Â这类字符)本质是XML读取和保存时的编码不匹配导致的。原XML声明是UTF-8,但PowerShell默认的Get-Content和XmlDocument.Save()行为可能没有严格遵循这个编码要求,下面是具体的修复方案:
问题根源
- 读取阶段:
Get-Content在Windows系统默认使用ANSI编码读取文件,如果原XML是UTF-8(尤其是不带BOM的UTF-8),读取时就会出现字符解码错误,后续保存自然会乱码。 - 保存阶段:
XmlDocument.Save()方法默认行为是:如果XML声明里指定了UTF-8,它会保存为带BOM的UTF-8,但很多编辑器/系统默认的UTF-8是不带BOM的,这就会导致字符显示异常。
具体修复步骤
1. 读取XML时明确指定UTF-8编码
修改读取XML的代码,加上-Encoding UTF8参数,确保正确解码原文件:
[xml]$MyXML = Get-Content $file -Encoding UTF8
2. 保存XML时精确控制编码(替代默认的Save()方法)
不要直接用$fileContent.save($fileURI),改用XmlTextWriter来指定编码,这样可以完美匹配原文件的UTF-8格式(带/不带BOM都能控制):
替换你的保存代码:
# 替换原来的 $fileContent.save($fileURI) $xmlWriterSettings = New-Object System.Xml.XmlWriterSettings # 如果原文件是带BOM的UTF-8,用下面这句 $xmlWriterSettings.Encoding = [System.Text.Encoding]::UTF8 # 如果原文件是不带BOM的UTF-8,改用这句(更常见) # $xmlWriterSettings.Encoding = New-Object System.Text.UTF8Encoding($false) $xmlWriterSettings.Indent = $true # 保持原文件的缩进格式 $xmlWriterSettings.OmitXmlDeclaration = $false # 保留XML声明 $xmlWriter = [System.Xml.XmlWriter]::Create($fileURI, $xmlWriterSettings) $fileContent.Save($xmlWriter) $xmlWriter.Close()
3. 修复代码中的小笔误(可选但重要)
你的getAssigneeID函数里有个变量错误:if ($assigneeID -eq $null -or $a -eq "")里的$a应该是$assigneeID,否则逻辑会出错,修改后:
function getAssigneeID ($assigneeName) { $assigneeID = $nameIDHash[$assigneeName] if ($assigneeID -eq $null -or $assigneeID -eq "") { return 'Not Found' } else { return $assigneeID } }
验证效果
修改后重新运行脚本,打开保存后的XML文件,你会发现未编辑节点的乱码消失了,同时编辑过的节点也能正确保存,编码完全匹配原文件的UTF-8设置。
内容的提问来源于stack exchange,提问作者Steve Gray




