今天尝试编写一个简单PowerShell脚本时,发现echo出的中文内容显示乱码,一番查找资料才得到解决,遂记录在这里。

省流:将文件编码改为UTF-8-BOM

原因说明

如果需要在脚本中使用非 Ascii 字符,请将它们保存为带有 BOM 的 UTF-8 文件。 如果没有 BOM,Windows PowerShell 会将脚本误解为是在旧的“ANSI”代码页中编码的。

相反,具有 UTF-8 BOM 的文件在类 Unix 平台上可能会出现问题。 许多 Unix 工具(如 cat、sed、awk)以及一些编辑器(如 gedit)不知道如何处理 BOM。 ——PowerShell参考文档

即:Windows默认使用BOM来区分Unicode和非Unicode编码,对非Unicode就会使用程序指定的ANSI编码页来解读,而Unicode则会使用另一套称为宽字符的方法。

此历史遗留问题在 PowerShell 6.0 以上的版本中已得到修正,但截至目前(Windows 11 26100.3194),系统自带的 PowerShell 仍然只是 5.1 版本,因此更新PS版本也可以解决此问题。

错误方法

我开始时编写的.ps1文件内容十分简单,仅用于快速启动一些程序:

# 桌面路径
$desktopPath = "$env:USERPROFILE\Desktop"
# 需要启动的应用程序路径
$apps = @(
    "Internet\QQ.lnk",
    "Internet\微信.lnk",
    "Internet\Google Chrome.lnk"
)  

foreach ($app in $apps) {
    try {
		    echo "正在启动:$desktopPath\$app"
        Start-Process "$desktopPath\$app" -ErrorAction Stop
    }
    catch {
        Write-Warning "无法启动应用程序:$_"
    }
}
pause

但此时其中中文出现乱码。

我自然认为是编码页不同导致的,于是在文件开头添加了如下两行:

chcp 65001
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

问题未能得到解决。

后在中文互联网搜索,结果基本都是更改编码页,而且大量同一篇文章的复制粘贴。

后找到一篇大佬的博客才得以解决,博客文末附有介绍字符编码和Windows这部分处理的历史包袱的文章链接,感兴趣可以点进去看一下。