居然被平台自动设置为 VIP文章 了。。。也不征求作者意见的??!重新发布一下
1. 区分PowerShell 和 Windows Powershell
PowerShell 在 6.0 版之前只存在于Windows,基于.NET Framework构建,两词无区别。
从 6.0 开始基于.NET Core重新构建了PowerShell,开始可以跨平台(Windows、macOS 和 Linux),而Windows Powershell仍专属于Windows,两词区别开来,分别指两个不同的东西。
截至目前 Windows Powershell最新为5.1版,PowerShell已到7.2版。两者日常使用基本相同,但也有一定区别,按下不表,可看官方文档。在Windows上两者可共存,独立使用。
官方文档:
https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/migrating-from-windows-powershell-51-to-powershell-7
https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/differences-from-windows-powershell
2. 涉及PowerShell编码的两个变量
- [Console]::OutputEncoding :控制台用于写入输出(即屏幕显示)的编码,使用的默认代码页(CodePage)由Windows系统区域设置确定,不论是PowerShell 还是Windows Powershell,简体中文为936代码页。单纯解决显示汉字乱码之类问题的话就是要改这个。
https://docs.microsoft.com/zh-cn/dotnet/api/system.console.outputencoding
- $OutputEncoding :为PowerShell和其他程序交互传送数据时使用的编码,6.0版本之前的Windows Powershell 默认为ASCII,之后的Powershell默认为UTF8。
3.更改 [Console]::OutputEncoding 编码为UTF8
注:以下基于 Windows PowerShell 说明,且简称为 PowerShell。
3.0 修改系统区域设置
Beta内容,会有很多问题,不推荐。
3.1 修改注册表
-
操作:
HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe
内更改(如没有则自己添加)CodePage(DWORD值十进制65001)。
-
效果:对于直接启动PowerShell.exe有效,通过快捷方式启动、在新的Windows Terminal终端启动、在VSCode集成终端启动 均无效。
-
原因解释:快捷方式启动PowerShell和直接运行PowerShell.exe有区别,快捷方式上可以附加设置(可以对快捷方式右键查看属性),会覆盖exe程序本身的设置。Terminal和VSCode不确定,可能是同理吧。
3.2 chcp 命令
chcp是源于cmd的命令,用于改变代码页CodePage,PowerShell中也可使用,但需在启动PowerShell时使用才有效,因为 .net会缓存启动时的代码页,在PowerShell会话中再使用chcp改变代码页会被忽略。所以,可以实现目标,但要注意使用方法.。
-
控制台:
在CMD或PowerShell中运行powershell -NoExit -Command "chcp 65001"
,可以开启一个UTF8的PowerShell。
注:powershell -?
可以看 -NoExit、-Command的含义。 -
新的Windows Terminal终端(未起效,不知原因):
设置 -> 配置文件 - > Windows PowerShell -> 命令行,在%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
后面添加-NoExit -Command "chcp 65001"
没效果,不知为何。 -
VSCode 集成终端:
在设置settings.json 中修改如下项,添加 args 参数内容,可以在启动PowerShell集成终端时更改代码页为UTF8。
注:此方法稍不优雅,不管想不想都无法看到PowerShell正常显示的Logo(版权文字),而且还会输出一行Active code page: 65001
,看网上的方案在chcp 65001
后加> null
重定向,可以消除这行输出,但我加了后是重定向到一个以null为名的文件里去了…… 总之,做不到无感、透明。
3.3 添加PowerShell配置文件(推荐)
- 通过启动时加载的配置文件对PowerShell实现自定义。关于配置文件的官方文档:
https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_profiles
- 操作:
① PowerShell中运行New-Item -ItemType File -Path $PROFILE -Force
,会在 C:\Users\<用户名>\Documents\WindowsPowerShell 下创建配置文件(当前用户、当前主机类型)Microsoft.PowerShell_profile.ps1。
② 用记事本等打开(初始为空),编辑输入$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
,将三个编码相关变量都置为UTF8。
③PowerShell中运行 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
,设置当前用户的配置文件执行策略为RemoteSigned(网上下载的需要可信签名、本机编写的不需要)。
关于执行策略: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies
④重启启动PowerShell(控制台、终端Terminal或VSCode集成终端中)即可。
4. 其他:
- 为正确显示 unicode还需选择合适的字体,需用TrueType字体,如Consolas、Lucida Console。
- 重要参考资料:
https://stackoverflow.com/questions/57131654/using-utf-8-encoding-chcp-65001-in-command-prompt-windows-powershell-window