ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CMD、PowerShell、WSL、Windows Terminal:区别、选型与美化方案

2026/9/26 6:21:13 拓冰建站 浏览量
CMD、PowerShell、WSL、Windows Terminal:区别、选型与美化方案 很多朋友第一次认真接触 Windows 命令行都是被同一个问题逼到这里的为什么我明明输入了 python黑窗口却提示“python”不是内部或外部命令为什么别人截图里的终端有花哨的提示符、漂亮的配色还能一边开 Ubuntu 环境一边开 PowerShell这里涉及四个名字高度相似的东西——CMD、PowerShell、WSL、Windows Terminal。它们四个名字经常混着出现但实际上是完全不同层面的东西。这篇文章适合刚入门的同学也适合已经用了一段时间但一直没搞清边界的人。我会把这四者的定位、区别、选型讲明白再给你一套可以直接照抄的 Windows Terminal 美化方案从配色、字体到提示符主题一次配到位。1. 先把名字分清四个“命令行概念”的定位1.1 CMDWindows 的古老传家宝CMD 全名是命令提示符Command Prompt对应的是 cmd.exe 这个进程。它最早可以追溯到 DOS 时代后来 Windows NT 内核里一直保留了它。它的本质是一个面向文本的命令解释器你敲一行命令它按照语法去解析调用对应的程序把结果以文本形式打印在屏幕上。就这么简单。CMD 能做的日常操作其实不少dir、cd、copy、del、ipconfig、netstat -ano、taskkill /F /PID、ping、net use 等等。批量处理靠 .bat 或 .cmd 脚本。我直到现在还在用 CMD 处理一些快速网络排查比如查端口、杀进程netstat -ano | findstr :8080 taskkill /PID 12345 /F一条命令就够不用开任务管理器点半天。但 CMD 的短板也很明显。第一它的脚本语言非常简陋没有函数、没有对象、没有变量作用域写复杂逻辑几乎是在自虐第二所有输出都是纯文本你很难对输出做结构化处理——比如你想拿到所有进程的 CPU 占用然后排序CMD 做起来非常痛苦第三对 Unicode 支持很差中文环境下经常出现乱码这也是很多人被“为什么 ping 返回的是乱码”劝退的原因。还有一个历史包袱CMD 的很多行为是当年为了兼容 DOS 留下的各种转义规则、路径解析规则都很反直觉。比如 %VAR% 展开机制、延迟变量、for /f 嵌套引号这些东西不是设计出来的是历史层叠出来的。我的建议是CMD 不是不能用而是要把它当成“应急工具箱”。日常交互式折腾、写复杂脚本请往下看 PowerShell。1.2 PowerShell面向对象的命令行如果说 CMD 是文本搬运工那 PowerShell 就是对象加工厂。它是微软 2006 年开始推出的新一代 shell彻底换了一个底层的设计思路。PowerShell 的关键创新是命令的输出不再是“文本”而是“对象”。你执行 Get-Process返回的不是一堆字符串而是一组 Process 对象每个对象有 Id、CPU、Memory、ProcessName 等属性。你想从中筛选、排序、计算直接对对象操作Get-Process | Where-Object { $_.WorkingSet64 -gt 200MB } | Sort-Object CPU -Descending这在 CMD 里简直没法想象。管道的概念也从“文本流”变成了“对象流”一个 cmdlet 吐出来的对象下一个 cmdlet 直接接收不需要再用 findstr 去匹配文本、再用奇怪的 for 循环去拆字段。PowerShell 的 cmdlet 命名遵循“动词-名词”结构Get-Process、Set-Location、Test-NetConnection、Remove-Item。背命令比 CMD 容易得多因为规律性极强。还有几个对日常特别有用的点。可以直接调用 .NET 类库写复杂逻辑时觉得内置 cmdlet 不够用直接 [System.IO.File]::ReadAllText() 都可以有完整的脚本语言能力函数、类、异常处理、模块可以写正式的工具自带强大的帮助系统Get-Help、Get-Command、Get-Member 几乎是边用边查的脚手架。但 PowerShell 也有学习曲线。主要的坎是它的语法比较“重”各种符号看着吓人$、、{}、管道后面接函数。我见过不少 CMD 老手第一次被 [$.Name] 吓得头疼。其实适应两周就好了关键是理解“一个 cmdlet 吃进对象、吐出对象”的心智模型。另外要区分一个容易混淆的点Windows 自带的 PowerShell 5.1Windows PowerShell基于 .NET Framework只能在 Windows 上跑和跨平台的 PowerShell 7.x基于 .NET可以装在 Linux/macOS 上。平时命令行里输 powershell 启动的是 5.1输 pwsh 启动的是 7.x。Windows PowerShell 5.1 已经进入维护期新功能不更新了我个人建议新环境直接用 PowerShell 7。1.3 WSL藏在 Windows 里的 LinuxWSL 全称是 Windows Subsystem for Linux它解决的问题很现实很多开发工具、脚本、服务在 Linux 生态里才是第一公民。Docker 的爽快体验、Node/Python 的很多发行包、各种编译链在 Windows 原生环境里要么装起来费劲要么行为怪异。以前大家被迫装双系统或者用虚拟机WSL 让 Windows 用户不用离开系统就能跑一个原生的 Linux 用户态环境。WSL1 和 WSL2 是两代完全不同的实现。WSL1 是一个系统调用的转换层把 Linux 的系统调用翻译成 Windows 的系统调用启动快、跟 Windows 文件系统交互也快但兼容性差——很多依赖 Linux 内核特性的程序跑不了。WSL2 则把真正的 Linux 内核塞进了一个轻量级虚拟机里兼容性大幅提升Docker 也终于能用 WSL2 后端跑得舒服了。代价是比较占内存、虚拟磁盘文件 VHDX 会越来越大。安装 WSL 现在非常无脑管理员身份运行终端执行wsl --install它会自动启用相关功能、下载默认发行版默认 Ubuntu。装完重启按提示创建 Linux 用户名和密码就行。如果下载特别慢常见原因是网络波动可以换时间段重试或者用 wsl --update 先把 WSL 本体更新到最新再继续安装发行版。WSL 日常使用中我的几个核心习惯用 wsl --list --verbose 看当前发行版和版本确认跑的是 WSL2在 WSL 内部用 Linux 原生的路径和命令不要有事没事去访问 /mnt/c跨文件系统 IO 很慢WSL 和 Windows 之间的互操作Interop很好用在 WSL 里可以直接敲 notepad.exe在 PowerShell 里可以直接敲 wsl ls想改 WSL2 的内存和 CPU 限制在 Windows 用户目录下放一个 .wslconfig 文件。你会在 Windows Terminal 里看到 WSL 的发行版自动成为一个配置项比如“Ubuntu”点开就能进入 Linux 命令行。这也是很多人第一次把 WSL 和 Windows Terminal 联系起来的契机。1.4 Windows Terminal它们共同的“新客厅”到这里你应该发现了CMD、PowerShell、WSL 都是“干活的引擎”而 Windows Terminal 不是引擎而是“客厅”——它是一个终端模拟器负责给你一个好看的窗口、多标签、多窗格、快捷键、统一的外观配置然后把 CMD、PowerShell、WSL、SSH 这些会话都装在这个窗口里。以前 Windows 上的命令行窗口是 conhost.exe控制台宿主每个窗口就是一个独立的经典黑框字体、颜色、缩放都很难配置。微软从 2019 年开始推出 Windows Terminal从底层重写了渲染管线支持 GPU 加速渲染、Unicode 字符、字体连字、真彩色、背景透明或亚克力效果并且把配置收敛到一个 settings.json 文件里。它的核心概念有三个。Profile配置文件每个 Profile 定义了一个会话类型比如“Windows PowerShell”“Command Prompt”“Ubuntu”还可以自定义“新建 SSH 会话”这样的 Profile。Tab/Pane多个会话可以放在不同的标签页一个标签页里还能左右或上下分屏。Settings用户配置在 settings.json 里跟过去的图形界面配置完全不同但胜在可版本管理、可分享。我个人对 Windows Terminal 的评价它可能是我这些年获得的性价比最高的微软工具装上之后CMD 和 PowerShell 的体验是“从石器时代直接跳到新时代”。2. 定位与对比什么时候用哪个2.1 一张表看清四大角色的差异维度CMDPowerShellWSLWindows Terminal本质文本命令解释器对象化脚本环境/SHELLLinux 子系统终端模拟器外壳窗口默认安装有有5.1需安装Win11 自带Win10 可装输出形式文本对象Linux 文本/程序渲染文本与 ANSI 转义脚本能力差批处理强.ps1丰富bash/zsh/python无不是脚本环境适用场景应急、简单系统操作Windows 系统管理、自动化开发工具链、Docker、Linux 生态统一窗口、多会话、美化典型代表命令dir, ipconfig, netstatGet-Process, Get-Serviceapt, grep, systemctl标签页/窗格/主题切换表格里有一个关键点需要强调WSL 里跑的命令全是 Linux 原生命令跟 Windows 没关系Windows Terminal 本身不执行命令它只负责把你的按键发送给会话进程再把进程的输出画在窗口上。很多人不理解“终端”和“Shell”的区别以为换了 Terminal 就能执行更多命令这是个常见的认知偏差。2.2 不同任务场景下的选型建议我按真实工作流给几套组合。场景一日常 Windows 系统维护比如查端口、杀进程、改服务、看日志。选 PowerShell。理由很简单对象输出让你可以精确筛选而且 Get-Service、Get-WinEvent、Get-Process 这些命令比 CMD 的 net 系列强太多。场景二写自动化脚本、定时任务比如开机自启脚本、备份、数据处理。选 PowerShell 7。PowerShell 脚本的异常处理、模块化、错误捕获能力齐全配合 Windows 任务计划程序很舒服。很多人搜“powershell开机自启脚本”其实就是在任务计划程序里设置触发器为“登录时”操作里选 powershell.exe -File xxx.ps1或者干脆做成启动文件夹里的快捷方式。注意脚本要经过执行策略允许否则开机后只有错误日志、没有实际效果。场景三开发环境比如 Python、Node、Docker、编译工具链、人工智能模型训练。选 WSL2。这不是“Windows 不行”而是绝大多数开发工具在 Linux 生态里维护最勤、坑最少。装 Python 依赖、跑 pip、编译 C、用 Docker 后端WSL2 都是更顺的选择。特别是 Docker Desktop 的 WSL2 后端几乎是无痛跑容器的标准姿势。场景四什么都要用还要好看的界面。用 Windows Terminal 统一开默认 Shell 设成 PowerShell 或者你常用的 WSL 发行版其他会话按标签页扩展。热词里提到的“windows启动elasticsearch”“redis windows下载”这类服务型需求如果你在 WSL 里跑反而比直接在 Windows 上找安装包省事因为很多中间件官方只维护 Linux 版本。还有一类纯想用命令行写简单的批处理、远程管理老服务器CMD 也不是不能用但请把交互式输入和复杂逻辑留在 PowerShell 里。2.3 选型时最容易踩的认知坑第一个坑把 CMD 和 PowerShell 当成同一个东西以为学了 CMD 就懂 PowerShell。这俩是两套完全不同的语法和心智模型你会 cd、dir 不代表你会 PowerShell。但你也不用怕PowerShell 特意兼容了一批常用别名在 PowerShell 里输入 cd、dir、copy、del 照样能用因为它们是 Get-Location、Get-ChildItem、Copy-Item、Remove-Item 的别名。过渡期很平滑。第二个坑以为 WSL 是“在 Windows 上装了个 Linux 模拟器”。WSL2 是真实的 Linux 内核只不过运行在虚拟化技术之上。你的 Ubuntu 环境里 apt 安装的包、跑的进程都是货真价实的 Linux 版。反过来也意味着烧内存默认 WSL2 可能吃掉你可用内存的一半这个后面说怎么限制。第三个坑把 Windows Terminal 和 Windows PowerShell 混淆。有人问“为什么我装完 Windows Terminal 打开还是黑窗口、命令还是那些命令”因为 Terminal 只是载体里面的 shell 还是 PowerShell 或 CMD功能并不会因为换了 Terminal 而自动变强。不过 PowerShell 7 Windows Terminal oh-my-posh 三件套组合起来体验会有质的飞跃。第四个坑不区分启动命令。powershell.exe 启动的是老版 5.1pwsh.exe 启动的是新版 7.x。WSL 的发行版启动命令是 wsl -d Ubuntu或直接 wsl。不同入口背后是不同的配置和行为排错前先确认自己进的是哪个环境否则可能在一套配置里调了半天结果发现根本没有加载。3. Windows Terminal 美化方案从默认到看着舒服3.1 安装与基础配置改 settings.json 前必做的一件事Windows Terminal 在 Windows 11 上已经预装Win10 可以通过 Microsoft Store 搜索“Windows Terminal”安装。装完打开默认会列出你电脑上已有的 CMD、PowerShell、以及 WSL 发行版等 Profile。顺手的话把默认终端defaultProfile改成你常用的那个比如设置成你的 Ubuntu 或 PowerShell 7。关于配置方式Windows Terminal 的菜单路径是“设置 - 打开 JSON 文件”。我强烈建议所有美化操作都在 settings.json 里做不要依赖界面按钮——因为 JSON 文件可复制、可备份、可同步网上分享的美化配置也都是 JSON 片段。一个必做的基础操作开启“默认终端应用程序”设置。在 Windows Terminal 设置里有一个“启动”页把“默认终端应用程序”选为“Windows 终端”。这样你以后在任意地方运行 cmd.exe、powershell.exe都会在 Windows Terminal 的新标签页里打开而不是弹出一个丑陋的单独黑框。这个开关解决了我很大的一个痛点以前动不动弹出来的黑框有时候想截图都截不全。还有一个提升幸福感的点先记住常用快捷键。CtrlShiftT 新标签页、CtrlShiftD 复制标签页、AltShiftD 分屏、CtrlShiftP 命令面板。所有快捷键都可在 settings.json 的 actions 里改习惯之后效率提升非常明显。3.2 配色方案给终端一个顺眼的“皮肤”Windows Terminal 默认配色是 Campbell老实讲不算难看但看久了确实有点腻。我推荐的路线是找一个社区成熟的配色直接贴进 settings.json 的 schemes 数组。我常用的两个方向One Half Dark 是微软官方也自带的配色眼睛舒适Catppuccin Mocha 低饱和、柔和长时间盯着不累Tokyo Night 偏冷色调代码对比度好。具体做法很简单复制配色方案的 JSON粘贴进 settings.json 的 “schemes”: [ ... ] 数组里然后在你的 Profile 里设置 “colorScheme”: “Catppuccin Mocha”。我个人的准则是终端配色要低对比度、低饱和、别刺眼。因为终端是长时间工作的背景工具不是发朋友圈的截图。某些霓虹风配色第一眼看很炫一天下来眼睛像被针扎真的别选。除了文字配色背景效果也是美化大头。Windows Terminal 支持在 Profile 里设置opacity: 78, useAcrylic: true配合 Windows 11 的云母效果还可以用 “backgroundEffect”: “mica”。我个人喜欢把窗口开得很宽但不全屏背景透明度压到 78% 左右再配一个深色壁纸工作的时候能看到壁纸的色块又不会干扰阅读。注意半透明效果在性能较差的机器上会带来一点渲染开销如果拖动窗口明显掉帧就把 useAcrylic 临时关掉。3.3 字体缺了 Nerd Fonts 再美的主题也白搭这是美化方案里最容易被忽略、但最影响颜值的一环。很多终端主题比如 oh-my-posh会用到一些特殊字符分支图标、箭头、电源线符号、状态小图标。这些字符在普通字体里没有如果你不装带图标补丁的字体屏幕上就会出现一个个“口口口”方块主题瞬间垮掉。解决办法装 Nerd Fonts 字体。Nerd Fonts 是一组把大量图标字体Font Awesome、Powerline 等合并进主流等宽字体后的字体集合。我个人常用 Cascadia Code Nerd与 Windows Terminal 的默认字体同源风格最搭和 JetBrainsMono Nerd代码感更强。下载后用右键安装然后在 Windows Terminal 的 Profile 里设置font: { face: CascadiaCodeNerd }装完重启 Windows Terminal你会看到提示符里的图标全出来了。这一步很多人漏掉然后以为主题坏了其实只是字体问题。还要提一下字体连字Ligature。Windows Terminal 默认支持Cascadia Code 本身就带连字特效比如 -、 会渲染成连着的箭头符号。喜欢极简风的话关掉其实更清爽。个人建议开看代码的时候确实顺眼。3.4 用 oh-my-posh 把 PowerShell 变成生产力工具配好了 Terminal 的皮肤和字体接下来给 PowerShell 本体装“主题”。这里我推荐 oh-my-posh——它本来是 PowerShell 社区的名人 Jan De Dobbeleer 做的现在 Windows、macOS、Linux 通吃是终端提示符美化的标准答案之一。安装很简单在 PowerShell 执行winget install JanDeDobbeleer.OhMyPosh然后编辑 PowerShell 配置文件让它每次启动时加载notepad $PROFILE如果提示不存在先执行New-Item -ItemType File -Path $PROFILE -Force在 $PROFILE 里写入oh-my-posh init pwsh | Invoke-Expression保存后重启 PowerShell提示符立刻变成彩色主题。oh-my-posh 的主题切换是Set-PoshPrompt -Theme jandedobbeleer主题文件非常多比如 agnoster、powerlevel10k_rainbow、paradox、atomic 等。不过光换主题还不够想让提示符显示 Git 分支、Python 虚拟环境、执行时间这些信息你需要在主题 JSON 里配置 segments。但这里我给新手一个建议先从默认主题开始用而不是调。等你理解了 segment 的机制再去在 ~/.poshthemes 里抄一个喜欢的主题文件改两段。除了主题还有两个让 PowerShell 更好用的经典组件。一个是 posh-git在提示符里集成 Git 分支状态安装用 Install-Module posh-git然后在 $PROFILE 里 Import-Module posh-git。另一个是 PSReadLine 设置在 $PROFILE 里加一句Set-PSReadLineOption -PredictionSource History这样你在命令行里输入历史命令时会出现灰色补全提示按右箭头直接采纳日常效率提升很大。我最终的开机自启脚本 $PROFILE 大概长这样Import-Module posh-git oh-my-posh init pwsh | Invoke-Expression Set-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineOption -EditMode Windows写完记得保存后执行 . $PROFILE 重新加载或者干脆重开一个标签页。4. 实操联动与踩坑排查4.1 WSL 与 Windows Terminal 的联动配置Windows Terminal 会自动发现 WSL 发行版并生成 Profile所以装上 WSL 后打开 Terminal 的标签下拉菜单就能看到“Ubuntu”。但有几个联动细节值得自己动手。第一给 WSL Profile 设置启动目录。默认 WSL 启动会回到发行版用户目录我一般不做修改。但如果你混用了多个发行版建议在每个 Profile 的 “commandline” 里显式写明 wsl.exe -d Ubuntu防止默认发行版发错。commandline: wsl.exe -d Ubuntu第二通过 WSL Profile 调出 Windows 程序。在 WSL 里直接输入 notepad.exe、code .Windows 程序会正常启动文件目录按 Windows 路径映射。这个互操作机制日常很香从 WSL 里快速用 VSCode 打开当前目录code .。但注意要在 Windows 侧装好 VSCode并且安装“Remote - WSL”扩展才能真正连上 WSL 内部环境。热词里提到的“在vscode中使用wsl”其实就是这个流程。第三限制 WSL2 的资源占用。这是很多人的痛点——WSL2 的虚拟机会按主机可用内存的一定比例默认吃内存。如果你跑个机器学习或者开一堆发行版内存一下子就紧张了。方法是在 Windows 用户目录建 .wslconfig[wsl2] memory8GB processors4 swap2GB然后执行 wsl --shutdown 重启 WSL 生效。这里我特别想说如果你在 WSL 里跑深度学习或大数据任务建议内存给足如果只是写点脚本1-2GB 都够。给太少了反而会频繁交换导致卡顿。4.2 乱码、权限、杀端口高频问题的排查思路热词里有一堆跟乱码、权限、端口相关的搜索这说明这些是新手最容易碰到的坎。统一总结一下。乱码问题的根源基本都是编码不匹配。Windows 中文系统默认 GBK代码页 936而 Linux 和现代工具默认 UTF-8两条命令之间互相传文本时就会乱。PowerShell 里的治标方法是$OutputEncoding [Console]::OutputEncoding [Text.Encoding]::UTF8或者临时切换代码页chcp 65001。但治本方案是统一用 UTF-8。Windows Terminal 的 Profile 里默认已经支持 UTF-8把 PowerShell 7 的文件编码设置为 UTF-8 无 BOMWSL 内部本身就是 UTF-8 环境不乱。遇到 cmd 输出乱码时先看是不是代码页的问题别急着格式化系统。权限与执行策略是另一类高频问题。PowerShell 默认 ExecutionPolicy 是 Restricted脚本不能随便跑。想放开管理员 PowerShell 执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser热词里那条“powershell -ep bypass -c ...”其实就是 -ExecutionPolicy Bypass 的简写意思是本次执行绕过策略。这是脚本分发场景的常见姿势但我提醒一句从网络上下载后直接执行的脚本一定要先看看内容再跑别养成本能性的复制粘贴执行。开机自启脚本跑不起来九成原因不是代码而是策略和执行用户权限。先手动跑一遍再检查任务计划程序的“使用最高权限运行”选项。杀端口也是每天都会遇到的问题。CMD 里是 netstat -ano | findstr :8080 拿到 PID再 taskkill /PID 12345 /F。PowerShell 里更优雅Get-NetTCPConnection -LocalPort 8080 | Select-Object -ExpandProperty OwningProcess拿到 PID 后 Stop-Process -Id xxx -Force。如果 netstat 查不到但端口还是被占用考虑是不是 WSL 内部进程在监听。用 wsl netstat -tlnp 去 WSL 内部查。其他几个高频问题也顺带说一下。python 敲了没反应先确认 python 安装时勾了“Add Python to PATH”然后重开一个终端环境变量不会自动刷新到已开的进程。cmd 打开即闪退多半是注册表里的 AutoRun 命令或环境变量 PATH 里有非法字符。用 regedit 查 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun清掉可疑内容。“WSL needs updating”提示多半是 WSL 版本太旧直接管理员终端执行 wsl --update再 wsl --shutdown 重启生效。4.3 个人经验我最终沉淀下来的日常配置这里放上我目前稳定使用的最终配置骨架可以直接抄。Windows Terminal settings.json 里关键片段defaultProfile: {你的 PowerShell 7 GUID}, profiles: { defaults: { font: { face: CascadiaCodeNerd }, colorScheme: Catppuccin Mocha, opacity: 78, useAcrylic: true, useAtlasEngine: true } }schemes 数组里粘贴 Catppuccin Mocha 配色 JSONactions 里自定义快捷键比如 CtrlShift1 开 PowerShell、CtrlShift2 开 Ubuntu。PowerShell $PROFILE 我最后保留的只有三行Import-Module posh-git、oh-my-posh init pwsh | Invoke-Expression、Set-PSReadLineOption -PredictionSource History。主题文件用了 paradox 的变体左侧显示路径、Git 状态、Python 环境右侧显示执行耗时。说实话调主题是个无底洞我建议控制在“能一眼看清状态就停手”把精力留给真正的任务。再说一个很多人没注意的配置习惯settings.json 和 $PROFILE 都可以放进自己的 dotfiles 仓库做版本管理。换新电脑装好 Terminal 和 PowerShell 7把这些文件拿回来几分钟就能恢复一模一样的工作环境。这个习惯比任何一条美化命令都值钱。我现在的工作流基本固定成这样的循环Windows Terminal 主窗口默认标签页开 PowerShell 7 处理 Windows 侧的事务杀进程、查日志、文件批处理、跑脚本需要打开 Ubuntu 时切换到 WSL 标签页跑开发命令偶尔用分屏让两个会话并排工作。整套东西看起来比默认黑框舒服很多但真正的收益不是“好看”而是每天节省下来的切换成本和注意力消耗。最后再提醒一句终端是工具不是收藏品。你可以花一个下午折腾配色、主题、字体但别陷入“配了三个小时还没开始写代码”的状态。把基础的三件套装好——Windows Terminal、PowerShell 7、oh-my-posh、Nerd Fonts——然后回到你真正要做的事情上。以后遇到新配色、新主题随手改一改保持好奇心就够了。