Windows 下 CMD、Terminal 以及 PowerShell 的区别和中文乱码问题
Windows 下 CMD、Terminal 以及 PowerShell 的区别和中文乱码问题
本文由 AI 工具 Hermes 辅助整理生成,内容基于本人提供或公开信息汇总。本人已对内容进行确认。
在 Windows 开发环境里,经常会遇到几个容易混淆的概念:
- CMD
- PowerShell
- Windows Terminal
.bat脚本.ps1脚本- UTF-8、GBK、代码页
尤其是在前端项目、微信小程序、Node 工具链里,如果脚本或文件编码处理不当,很容易出现中文乱码。本文简单梳理一下它们之间的区别,以及如何尽量避免编码问题。
一、Terminal、CMD、PowerShell 不是同一种东西
可以先用一个简单比喻理解:
Terminal 是窗口
CMD / PowerShell 是窗口里运行的命令解释器
.bat / .ps1 是交给命令解释器执行的脚本文件
也就是说,Terminal 本身通常不负责“理解命令”,它只是负责显示文字、接收输入、管理标签页、字体和颜色。
真正执行命令的是 Terminal 里面运行的 Shell。
二、什么是 Terminal
Terminal 指的是终端窗口,例如:
Windows Terminal
传统控制台窗口 conhost.exe
VS Code 终端
JetBrains 终端
微信开发者工具里的终端
它主要负责:
显示命令行界面
接收键盘输入
显示命令输出
支持标签页
支持字体、颜色、主题
Windows Terminal 可以打开不同的 Shell,例如:
Command Prompt
Windows PowerShell
PowerShell 7
Git Bash
WSL Ubuntu
所以,Windows Terminal 不是 PowerShell,它只是一个容器。
三、什么是 CMD
CMD 是 Windows 传统的命令解释器,程序是:
cmd.exe
它常用来执行:
dir
cd
copy
set
echo
xxx.bat
xxx.cmd
CMD 对应的脚本文件通常是:
.bat
.cmd
CMD 的优点是兼容性强,历史很久。缺点是语法老旧,变量、条件、循环都比较别扭,而且中文编码容易受系统代码页影响。
在中文 Windows 系统里,CMD 默认代码页经常是:
chcp
可能输出:
活动代码页: 936
936 通常对应 GBK / GB2312 这一类中文编码。
这也是为什么 .bat 文件里写中文时,很容易出现乱码。
四、什么是 PowerShell
PowerShell 是比 CMD 更现代的 Shell 和脚本语言。
Windows 自带的一般是:
Windows PowerShell 5.1
它的程序通常是:
powershell.exe
虽然路径里可能有:
v1.0
但这不代表版本是 1.0。实际版本要用下面命令查看:
$PSVersionTable
或者:
$PSVersionTable.PSVersion
如果显示类似:
5.1.x
就是 Windows PowerShell 5.1。
PowerShell 脚本文件通常是:
.ps1
注意是 .ps1,不是 .psl。
五、PowerShell 5.1 和 PowerShell 7 的区别
Windows 自带的 PowerShell 通常是:
powershell.exe -> Windows PowerShell 5.1
新版 PowerShell 通常是:
pwsh.exe -> PowerShell 7+
PowerShell 7 是新版、跨平台、更加现代的 PowerShell。它通常需要单独安装。
两者是并存关系,不是覆盖关系。也就是说,安装 PowerShell 7 之后,系统里通常会同时有:
powershell.exe -> Windows PowerShell 5.1
pwsh.exe -> PowerShell 7
所以如果你想用 PowerShell 7,需要明确运行:
pwsh
而不是:
powershell
六、PowerShell 5.1 为什么容易产生中文乱码
PowerShell 5.1 有历史包袱,尤其是在编码方面。
在 PowerShell 5.1 中,不同写文件方式的默认编码并不完全一致,例如:
Out-File
>
Set-Content
Add-Content
它们可能使用不同的默认编码。有的可能写成 UTF-16,有的可能按系统 ANSI 代码页写。
在中文 Windows 系统里,系统 ANSI 代码页经常接近 GBK。
而现代前端项目一般希望源码文件是:
UTF-8
所以如果 PowerShell 5.1 生成了 GBK 或 UTF-16 文件,而前端工具链按 UTF-8 去读取,就可能出现中文乱码。
常见场景包括:
生成 JS / TS 文件后中文注释乱码
生成 JSON 文件后中文内容乱码
生成 WXML / WXSS 文件后微信开发者工具显示异常
执行脚本时控制台输出乱码
七、升级 PowerShell 7 能不能解决乱码问题
答案是:可以大幅减少,但不能彻底保证所有乱码问题都消失。
PowerShell 7 的编码行为更现代,默认更偏向:
UTF-8 无 BOM
这和前端项目、Node、Vite、微信小程序、现代编辑器的习惯更加一致。
所以如果你主要做前端开发,安装 PowerShell 7 并把 Windows Terminal 默认 Shell 改成 PowerShell 7,是一个很好的选择。
但是,PowerShell 7 不能解决所有问题,因为:
CMD / .bat 仍然可能受代码页影响
老工具可能仍然按 GBK 读取文件
历史文件如果本身是 GBK,不会自动变成 UTF-8
Windows Terminal 只是窗口,不决定脚本文件编码
Windows PowerShell 5.1 仍然存在,误用 powershell.exe 还是可能踩坑
所以 PowerShell 7 是重要改进,但不是万能方案。
八、前端项目推荐使用什么编码
对于前端项目,推荐统一使用:
UTF-8 无 BOM
适合这些文件:
.js
.ts
.jsx
.tsx
.vue
.json
.css
.scss
.less
.html
.wxml
.wxss
这也是现代前端工具链最稳妥的选择。
尤其是微信小程序、Node、Vite、Webpack、ESLint、Prettier 等环境,默认都更适合 UTF-8。
九、写 PowerShell 脚本时如何避免乱码
如果脚本只面向 PowerShell 7,建议使用:
UTF-8 无 BOM
如果 .ps1 脚本需要兼容 Windows PowerShell 5.1,并且里面有中文字符串或中文注释,更稳的是:
UTF-8 with BOM
因为 PowerShell 5.1 对“无 BOM 的 UTF-8”识别不够稳定,有时会按系统 ANSI / GBK 去读。
在脚本里也可以显式设置输入输出编码:
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
写文件时,不要依赖默认编码,尽量明确指定:
Set-Content -Path "test.txt" -Value "中文内容" -Encoding UTF8
需要注意的是,在 Windows PowerShell 5.1 中,-Encoding UTF8 通常会生成 UTF-8 with BOM;而 PowerShell 7 的默认行为更接近 UTF-8 无 BOM。
十、写 BAT 脚本时如何避免乱码
.bat 文件是最容易踩中文编码坑的。
如果在 .bat 中使用中文,可以加:
@echo off
chcp 65001 >nul
echo 中文内容
并且把 .bat 文件保存为:
UTF-8 无 BOM
不建议 .bat 使用 UTF-8 with BOM,因为 BOM 可能污染第一行命令,导致奇怪问题。
更稳的做法是:
.bat 文件里尽量只写英文命令
中文内容交给 PowerShell、Node、JS 或 UTF-8 文本文件处理
十一、实用建议总结
如果你是前端开发者,建议这样配置:
安装 PowerShell 7
Windows Terminal 默认配置改成 PowerShell 7
日常命令优先使用 pwsh,而不是 powershell
项目源码统一 UTF-8 无 BOM
.bat 文件尽量不写中文
必须写中文 .bat 时使用 chcp 65001,并保存为 UTF-8 无 BOM
需要兼容 PowerShell 5.1 的 .ps1 中文脚本,使用 UTF-8 with BOM 更稳
一句话总结:
Terminal 是窗口,CMD 和 PowerShell 是 Shell。
PowerShell 5.1 编码历史包袱较多,PowerShell 7 对 UTF-8 更友好。
前端项目应统一使用 UTF-8 无 BOM,尽量避免 GBK。
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/20197741

浙公网安备 33010602011771号