Windows 环境安装的 PowerShell 7 默认编码解码是 UTF8 NoBom,用这个CodePage直接操作未修改默认编码的 Windows 文件内容,产生乱码不能识别的情况。有些文章采取变更整个 Windows的编码方式,但应用在已经使用一段时间的服务器上,因已存储了大量数据,有可能造成已存储文件错误。
以下方法只修改 PowerShell 7 的默认编码方式,实际测试可以读取和写入GBK编码文件。
1、在 PowerShell 7 命令窗口运行,如果 $PROFILE 不存在则创建
PS C:\> if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
2024-9-12 增加,$PROFILE 变量不加后缀,是当前用户当前主机的配置文件,也就是 $PROFILE.CurrentUserCurrentHost 。
如果需要配置计划任务,以Administrator身份运行脚本,则应配置所有用户当前主机,变量是 $PROFILE.AllUsersCurrentHost。
如需配置远程环境,则使用当前用户所有主机 $PROFILE.CurrentUserAllHosts,或所有用户所有主机 $PROFILE.AllUsersAllHosts
2、指令以 notepad.exe 打开 $PROFILE,VScode 之类任何文本类编辑器都可以。
PS C:\> notepad.exe $PROFILE
3、在新打开的 $PROFILE 也就是 Microsoft.PowerShell_profile.ps1 文件中插入内容。
# 参照WindowsPowerShell,也就是自带的那个版本,使用ASCII进行西文编码。
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::ASCII;
# 修改默认所有包含Encoding名称的参数值为GBK
$PSDefaultParameterValues['*:Encoding'] = 'GBK';
# 修改CodePage为936,并不做输出。
chcp.com 936 > $null
4、 $PROFILE 实际也是一个 .ps1 脚本,需要设置本地未经数字签名也可以执行的权限。
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
也可以简单设置成任何脚本均不核对签名。
PS C:\> Set-ExecutionPolicy Unrestricted
此后,同一个 Windows 用户再打开 PowerShell 7 终端时,与 Windows 自带的 PowerShell 5.1 环境相同。
附:
PowerShell 执行
PS C:\> [System.Text.Encoding]::GetEncodings()
可以列出全部 Windows 系统可支持的编码代码页,CP936实际上是GBK,CP20936是老的GB2312-1980编码,20936缺失很多字,比如瞭望的瞭。
可以用以下代码编写脚本自行测试:
# 测试脚本内修改PowerShell环境变量,以识别GB2312或GBK编码。PowerShell列表内未见GB18030页面支持。
Add-Content -Path "c:\testencoding.txt" -Encoding ascii -Value "This line is encoding by GB2312: " -NoNewline
Add-Content -Path "c:\testencoding.txt" -Encoding 20936 -Value “GB2312汉字写入测试,标志字符-瞭”
Add-Content -Path "c:\testencoding.txt" -Encoding ascii -Value "This line is encoding by GBK: " -NoNewline
Add-Content -Path "c:\testencoding.txt" -Encoding 936 -Value “GBK汉字写入测试,标志字符-瞭”
Add-Content -Path "c:\testencoding.txt" -Encoding ascii -Value "This line is encoding by UTF-8: " -NoNewline
Add-Content -Path "c:\testencoding.txt" -Encoding utf8 -Value “UTF-8汉字写入测试,标志字符-瞭”
另,WindowsPowerShell 和 PowerShell 7 的 $PROFILE 指向的路径不同,但文件名一致。
本文参考文档:
自定义 shell 环境 - PowerShell | Microsoft Learn
关于字符编码 - PowerShell | Microsoft Learn
关于执行策略 - PowerShell | Microsoft Learn
2024-9-12 增加 Profile 说明,来源文档: