PowerShell脚本因UTF-8无BOM导致报错,本质是5.1/7.x对编码策略收紧;5.1需加BOM或注册表修复,7.2+推荐用$PSDefaultParameterValues强制UTF-8输出与显式编码读取。

Windows 11更新后,PowerShell脚本执行时因BOM(字节顺序标记)缺失或存在引发“无法识别的字符”报错、中文注释乱码、函数名解析失败等问题,本质是PowerShell 5.1/7.x对UTF-8无BOM文件的默认兼容策略收紧所致。
确认当前PowerShell对UTF-8的解析行为
打开PowerShell(非管理员也可),逐行执行:
Get-ExecutionPolicy → 若返回Restricted,必须先执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser;
[System.Text.Encoding]::Default.CodePage → 显示936表示系统仍用GBK,不影响PowerShell本身,但影响chcp调用逻辑;
echo $PSVersionTable.PSVersion → 确保为5.1或7.2+,PowerShell 7.4+已默认启用UTF-8无BOM支持,5.1则严格依赖BOM。
方法一:为脚本添加UTF-8 BOM(兼容PowerShell 5.1)
用VS Code打开.ps1文件 → 按Ctrl+Shift+P → 输入“Change Encoding” → 选择“Save with Encoding” → 选“UTF-8 with BOM”;
Notepad++用户:编码→转为UTF-8-BOM → 再保存;
【关键提醒】PowerShell 5.1若读取无BOM的UTF-8脚本,会将首行中文注释(如# 测试)误判为非法token,直接报错终止,不执行后续任何代码。
方法二:强制PowerShell以UTF-8无BOM方式加载(推荐PowerShell 7.2+)
第一步:在脚本最顶部插入一行:$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8';
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
第二步:所有含中文的字符串输出统一用Out-File -Encoding utf8或Set-Content -Encoding utf8替代>>重定向;
第三步:避免使用Get-Content直接读取未声明编码的中文路径文件,改用Get-Content -Encoding UTF8显式指定;
这三步做完后,脚本可安全保存为无BOM UTF-8格式,且在PowerShell 7.2及以上版本中稳定运行。
方法三:注册表级永久修复(仅限企业环境批量部署)
方法一:管理员权限运行PowerShell,执行:
reg add "HKCU\Software\Microsoft\PowerShell\1\ShellIds\ConsoleHost" /v "ConsoleHostEncoding" /t REG_SZ /d "UTF-8" /f;
方法二:若需全局生效(影响所有用户),改写HKLM路径并加/f参数,但【必须重启PowerShell进程】才能生效;
注意:此注册表项仅被PowerShell 5.1识别,PowerShell 7+忽略该键,改用自身配置体系。










