You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell脚本编辑XML后乱码,如何修改保存编码?

解决PowerShell编辑XML后保存的编码乱码问题

你遇到的乱码问题(比如出现​Â这类字符)本质是XML读取和保存时的编码不匹配导致的。原XML声明是UTF-8,但PowerShell默认的Get-ContentXmlDocument.Save()行为可能没有严格遵循这个编码要求,下面是具体的修复方案:

问题根源

  1. 读取阶段Get-Content在Windows系统默认使用ANSI编码读取文件,如果原XML是UTF-8(尤其是不带BOM的UTF-8),读取时就会出现字符解码错误,后续保存自然会乱码。
  2. 保存阶段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

火山引擎 最新活动