PowerShell5 Import-Module加载特殊字符乱码 PS7无异常问题咨询
根本原因
该乱码问题的核心诱因是PowerShell 5与PowerShell 7对无BOM脚本文件的默认读取编码规则不兼容,具体触发逻辑:
- 模块内使用的点源导入逻辑
. $import.fullname,本质是让PowerShell直接从磁盘读取目标路径的.ps1脚本文件后执行,完全走PowerShell内置的默认文件编码解析流程。 - 模块Public、Private目录下的函数脚本文件未添加对应编码的BOM标记,多数场景下是保存为了无BOM的UTF-8格式。
- PowerShell 5读取无BOM脚本时,不会默认使用UTF-8解析,而是调用系统当前区域设置对应的ANSI编码(英文系统默认是Windows-1252,简体中文系统默认是GBK)解码文件内容。
你观测到的乱码正是UTF-8 BOM的字节序列0xEF 0xBB 0xBF被强制按Windows-1252编码解码的结果;乱码ÿþ是UTF-16 LE BOM的字节序列0xFF 0xFE被按Windows-1252解码的结果。 - PowerShell 7统一了跨平台编码逻辑,所有无BOM脚本默认按UTF-8编码解析,和现代代码编辑器的默认保存规则对齐,因此不会复现该乱码问题。
手动F8加载无乱码的原因
在编辑器中全选代码按F8执行时,代码不会走「从磁盘读取文件→按默认编码解码」的流程:编辑器本身已经正确识别了脚本文件的编码,传入PowerShell运行空间的是已经解码完成的正确字符串,因此BOM字符可以正常显示为(UTF-8 BOM)和ÿþ(UTF-16 LE BOM)。
兼容修复方案
- 若需要同时兼容PowerShell 5和PowerShell 7,将模块内所有.ps1脚本文件统一保存为带UTF-8 BOM的格式即可,两个版本的PowerShell都能正确识别该编码,不会出现解析乱码。
- 若仅需适配PowerShell 7及以上版本,直接保存为无BOM的UTF-8格式即可正常运行。
- 在PowerShell 5环境下不要依赖默认编码读取含非ASCII字符的无BOM文件,所有含特殊字符的脚本都需要添加对应编码的BOM标记。
内容的提问来源于stack exchange,提问作者baswijdenesdotcom
相关产品推荐
相关产品推荐

