尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows下cmd彩色ls完全指南:从原理到lsd配置

Windows下cmd彩色ls完全指南:从原理到lsd配置 有没有过这种时刻在 Windows 的 cmd 窗口里肌肉记忆让你敲下一个ls屏幕上却毫不留情地弹出一句“不是内部或外部命令”。好就算你咬咬牙装了个模拟工具结果出来的还是一整屏黑底白字连个目录和文件的颜色都分不清。这感觉就像从一间装修好的屋子突然被丢回毛坯房。我在 Windows 上折腾彩色ls这件事已经不是一两天了从注册表改 ANSI 转义、DOSKEY 宏定义、PowerShell 借壳到第三方工具基本把市面上的路都踩了一遍。这篇文章就把我最终沉淀下来的经验一次性说清楚cmd 里的ls到底为什么没颜色有哪几条路能实现彩色列表每条的优缺点是什么以及我最推荐的方案怎么配置、会踩哪些坑。如果你平时工作中要在 Windows 和 Linux/macOS 之间来回切换或者单纯受够了dir那种冷冰冰的输出这篇内容应该正合口味。我会把每一步都拆开讲既有原理也有实操你照着做就能在自己机器上复现。1. 为什么 cmd 里的 ls 让人浑身难受先搞清楚问题本质1.1 cmd 没有 ls只有 dir历史包袱这件事得从根上讲。ls来自 Unix 世界Windows 的 cmd 继承的是 MS-DOS 时代的命令体系文件列表命令叫dir。两者功能大方向一致但细节差很多ls的参数是-l -a -h这种风格dir的参数是/b /s /a这种风格ls默认按名称排序、输出简洁dir默认输出一大坨包括卷标、剩余空间、文件修改时间在内的信息。更要命的是Unix 下ls默认就会用颜色区分目录、普通文件、可执行文件、符号链接而 cmd 的dir压根没有内置配色方案。我见过不少教程说“用 dir 不就行了”这话从功能上讲没毛病但从实际操作感受上讲完全不是一回事。一个在终端里高频使用的命令输出有没有颜色直接影响信息抓取效率一眼扫过去能分清目录和文件和眯着眼睛逐行找是完全不同的体验。所以大家折腾彩色ls本质上不是矫情而是在给这个老掉牙的 shell 补现代终端本该有的体验。1.2 彩色输出的真正来源ANSI 转义序列和虚拟终端终端里的颜色本质上是输出文本里夹带的一串特殊控制码叫 ANSI 转义序列。比如ESC[32m表示把接下来的文字设为绿色ESC[0m表示重置样式。Unix 终端从几十年前就原生支持解析这套序列所以在 Linux 上只要程序愿意输出颜色终端就能显示。Windows 这边完全是另一个故事。早期 cmd 根本不解析 ANSI 转义序列你往屏幕里丢一个ESC[32m它不会显示成绿色文字而是直接给你渲染出一堆乱码字符。真正的转折点是 Windows 10 1607 版本微软给控制台加入了“虚拟终端处理”能力可以通过注册表键HKCU\Console下的VirtualTerminalLevel来开启。把这个值设为1cmd 就具备了基本的 ANSI 转义解析能力这也是后面所有“彩色化”方案的地基。很多人不知道这个机制所以折腾半天搞不定不是命令不对是你的终端压根不认颜色控制码。我后面会给出具体开关方法但先把这个原理放在这儿理解它比记命令重要得多。1.3 为什么网上很多“彩色 ls 教程”到你这儿就不灵了这些年我看过太多相关教程它们不灵的根源基本都是环境错位。常见的几种情况教程讲的是 PowerShell 里的lsPowerShell 的ls是Get-ChildItem的别名PowerShell 主机自带颜色渲染逻辑跟 cmd 完全是两套东西。你照搬到 cmd 里自然什么都得不到。教程讲的是 WSL 或 Git Bash 里的ls那些是 GNU 世界原生的工具直接继承 Unix 的颜色能力。可你要的是在原生 cmd 里用环境都不对。教程发布时间早于 Windows 10 1607那时候控制台还没有 VT 能力很多方案是通过第三方终端模拟器比如 ConEmu实现的跟现在的原生方案根本不是一条路线。所以说想真正解决“Windows cmd 里用彩色ls”这个问题你得先把终端能力、命令来源、配置方式这三层理清楚。接下来我就按照不同的折腾深度把几种可行方案整体过一遍。2. 方案横评从零改造到完全体五条路线一次说清先上一张总览表方便你根据自己的需求、系统版本、可接受的折腾程度进行选型。后面每个方案再展开讲。方案改动量最终效果适合人群DOSKEY 把 ls 映射成 dir极小无颜色仅有 ls 命令名只求命令名兼容的人注册表开启 VT 手写 ls.bat中有颜色但功能简陋无法安装软件的环境PowerShell 借壳小有颜色但启动慢、引号难搞偶尔用一下的人安装 lsd 并配置 doskey中彩色 图标 Git 状态追求体验的主力方案换 Windows Terminal PowerShell较大现代化终端 完整体验愿意彻底升级终端的人2.1 方案一DOSKEY 把 ls 映射成 dir最轻量但不解决颜色如果你只是受不了ls报错对颜色无所谓那么一条 DOSKEY 宏就够了。在 cmd 里执行doskey lsdir /B/B表示只显示文件名和目录名去掉dir默认输出的卷标、摘要等冗余信息输出格式上比较接近 Unix 的ls。敲完这条命令当前这个 cmd 窗口里就能用ls代替dir /B了。问题在于dir本身不带颜色参数你翻遍dir /?的帮助文档也找不到一个 color 相关开关。所以这个方案只能解决“命令名兼容”解决不了“输出难看”。再加上 DOSKEY 宏只在当前会话有效关掉窗口就失效真正要用还得配合注册表AutoRun持久化。因为这个方案实在谈不上“彩色”我一般只把它当作应急手段。2.2 方案二注册表开启 VT 手写 ls.bat能让你彻底理解 ANSI想搞清楚颜色到底怎么工作我建议你亲手做一次这个方案。整个过程不装任何第三方软件只依赖 Windows 自身的功能适合公司电脑没权限装东西的情况。第一步开启控制台的 VT 处理能力。打开 cmd执行reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 /f执行完关掉当前 cmd 窗口重新打开一个新的设置才会生效。然后你可以先做个快速验证在 cmd 里输入echo [32m 你好绿色 [0m注意这里的[字符在实际输入时需要处理成 ESC 字符直接在 cmd 里手敲会很麻烦。我建议先写一个小的批处理文件来测试。新建ls.bat内容如下echo off set ESC REM 这里的 ESC 变量在编辑时需要放入真实 ESC 字符大多数编辑器可用 Ctrl[ 输入 echo %ESC%[32m绿色文字%ESC%[0m echo %ESC%[34m蓝色文字%ESC%[0m如果你能把这两行文字显示出绿蓝两种颜色说明 VT 已经生效。此时理论上你可以用批处理写一个自己的“彩色 ls”脚本遍历当前目录判断是目录还是文件分别输出不同的 ANSI 颜色。但写几个小时代码你会发现批处理的文件类型判断、参数解析、排序能力都很弱做出来的东西距离真正的ls差了十万八千里。这个方案的价值在于教学它让你切身体会到彩色输出的本质是“输出端生成控制码接收端解析控制码”理解这一层之后后面所有方案你都能看懂在做什么。2.3 方案三借壳 PowerShell不装任何软件但只能凑合PowerShell 的ls是Get-ChildItem的别名而且 PowerShell 主机默认就会给目录、文件、隐藏文件等不同类型的条目上色效果接近 Unix 的ls。所以在 cmd 里你可以通过调用 PowerShell 来获得一份带颜色的列表powershell -NoProfile -Command ls为了省事也可以配成 DOSKEYdoskey lspowershell -NoProfile -Command ls $*这样在 cmd 里敲ls就会显示彩色输出。优点是不装任何软件、改造成本极低。但缺点也很明显每次执行ls都要启动一个 PowerShell 进程肉眼可见地卡顿少则几百毫秒多则一两秒。参数传递容易翻车。你敲ls -laDOSKEY 宏在处理通配符、引号、管道时cmd 和 PowerShell 两套语法互相打架经常出现奇怪的转义问题。如果你要用管道接其他命令比如ls | findstr xxx那么这个方案基本没法用因为findstr拿到的是 PowerShell 的输出对象转换出来的文本跟你预期不一样。我给出的评价是偶尔看下目录还行想作为日常主力工具它撑不住。2.4 方案四安装 lsd真正意义上的完全体这就是我最推荐的方案。lsd 全称ls deluxe是一个用 Rust 写的跨平台ls替代品专门解决的问题就是“Unix ls 的现代增强版”。它在 Windows 上能原生运行不依赖 WSL、Cygwin 或 Git Bash。功能亮点是默认彩色输出不同文件类型、权限、扩展名都有对应配色。自带文件图标可以靠图标快速区分常见格式。原生支持 Git 状态在 Git 仓库里能看到哪些文件被修改、新增、冲突。支持--tree一键以树状结构显示目录替代古老的tree命令。参数风格非常接近 GNUlsLinux 用户几乎零学习成本。安装方式我放在下一节专门讲这里先给结论这是我在 cmd 里找到的彩色ls体验最接近 Unix 的方案。你不需要被迫去 Ghost 或模拟什么lsd 就是为 Windows 原生环境设计的。2.5 方案五换终端Windows Terminal 才是治本之策说实话cmd 这个终端本身已经非常老旧了。它对 Unicode 的渲染能力弱没有多标签页GPU 加速缺失代码页问题一堆。即便你用上了 lsd在一个老旧的 cmd 窗口里观感还是受限。所以方案五的思路是不纠结怎么在 cmd 里实现彩色ls直接把 cmd 换掉——装 Windows Terminal它是微软官方的现代化终端支持 VT 解析、GPU 渲染、多标签、丰富配色主题。它默认可以启动 PowerShell、Cmd、WSL 等任意 shell而且对 ANSI 颜色的显示效果比原生 cmd 好得多。有人会说“那你直接让我换 WSL 或 Git Bash 不更彻底吗” 这条路确实能一步到位但那等于放弃了原生 Windows 环境。对很多跑 Windows 原生开发、维护 Windows 服务器的人来说终端里得同时操作 cmd 命令和 PowerShell 命令用 Windows Terminal 套两层壳更符合实际工作流。所以我的建议是Windows Terminal lsd一个管终端渲染一个管文件列表两件事都好体验直接起飞。3. lsd 实战安装、配置、避坑一条龙给你捋平既然前面已经反复说了 lsd 是我最推荐的方案这一节就把整个流程完整展开从安装到永久配置你照着操作就行。3.1 安装winget、scoop、choco 三选一lsd 官方支持多种安装方式。我按推荐程度排一下用 wingetWindows 10 1709 以上自带的包管理器最简单winget install lsd如果你用的是 Scoop直接scoop install lsd如果你习惯 Chocolateychoco install lsd装完之后先验证一下是否成功lsd --version能看到版本号就说明装好了。这里要给第一次用 lsd 的朋友提个醒刚装完别急着敲ls你在 cmd 里敲ls依然会报错因为 lsd 安装后的可执行文件叫lsd.exe不会覆盖系统里的ls命令。你需要把它和ls命令“接上线”这一步就是下一小节的内容。3.2 让 cmd 认识 lsddoskey AutoRun 双管齐下cmd 没有 Unix 那种.bashrc配置文件也没有直接设置 alias 的命令。唯一的别名机制是 DOSKEY 宏格式就是doskey lslsd执行后当前窗口里敲ls就等于敲lsd但窗口一关就失效。要让每个新开的 cmd 窗口都自动加载你得把这条命令塞进注册表。注册表路径是HKEY_CURRENT_USER\Software\Microsoft\Command Processor右侧有个字符串值叫AutoRuncmd 每次启动时都会读取它并执行里面的命令。可以在 cmd 里执行下面这行一步设置好reg add HKCU\Software\Microsoft\Command Processor /v AutoRun /t REG_SZ /d doskey lslsd /f设置完之后新开一个 cmd 窗口敲ls应该就能看到带颜色的输出了。不过我个人不建议把多条 DOSKEY 宏直接写死在注册表里因为后续要加ll、la这些别名时改注册表字符串会越来越乱。更规范的做法是单独建一个宏文件。比如在用户目录下建一个lsd_macros.doskey文件内容写lslsd lllsd -l --group-directories-first lalsd -la --group-directories-first然后 AutoRun 里只写一句reg add HKCU\Software\Microsoft\Command Processor /v AutoRun /t REG_SZ /d doskey /macrofile\C:\Users\你的用户名\lsd_macros.doskey\ /f以后想加别名直接编辑这个.doskey文件就行不用再碰注册表。注意路径里的反斜杠和引号写错了 cmd 启动时会报警告而且窗口可能一闪而过。3.3 定制颜色LS_COLORS、配置文件和环境变量lsd 默认配色已经很能打但如果你跟我一样是个“颜色强迫症”也可以自己调。首先lsd 支持 GNU 生态的LS_COLORS环境变量。你可以设置各种扩展名对应的颜色。比如让.zip文件显示成红色setx LS_COLORS *.zip01;31这个命令对所有新开的 shell 生效。01;31里的01表示加粗31表示红色。你可以组合出各种颜色比如32绿色、33黄色、34蓝色、35紫色、36青色前置01;加粗04;下划线。具体的格式参考 ANSI 颜色表网上随手就能查到。其次lsd 也支持配置文件。在 cmd 里执行lsd --config-file %USERPROFILE%\.config\lsd\config.yaml这会生成一个默认配置内容包含各种样式选项。你打开这个config.yaml会看到几个常用字段color: when: always表示永远输出颜色如果设为auto则只有检测到支持颜色的终端时才输出。icons: when: always这个开关默认会开启文件图标。如果你的终端不支持 Nerd Font图标会变成方框建议直接设成never。date: relative把文件时间显示成“今天”“昨天”“3 天前”这种相对格式比2024-05-12这种绝对时间直观很多。sorting: dir-group让目录排在文件前面这是我最喜欢的设置一屏扫下来非常舒服。改完配置保存重开 cmd 窗口再看ls输出效果差异一眼就能看出来。3.4 实测lsd 在 cmd 里的输出和观感我把实际体验给你们描述一下。在一个混合了文件夹、源码文件、压缩包、可执行文件的目录里输入ls目录显示为蓝色加粗一眼就能和普通文件区分。常见代码文件如.py、.js、.md也有自己的颜色区分。压缩包文件显示为红色系说明文件类型不同能快速识别。可执行文件是绿色跟 Linux 下的观感很接近。如果这个目录是 Git 仓库你还能看到被修改的文件前面有特殊标记新增文件也有对应标识这个特性是原生ls没有的。再试一下我前面说的几个常用命令lsd -l显示类似 Unixls -l的完整信息权限位、硬链接数、所有者、所属组、文件大小、修改时间、文件名每一行都有颜色区分。在 Windows 上能看到权限位这本身就很有意思。lsd --tree直接从当前目录输出一棵缩进树包含所有子目录和文件配合配色拿来快速理清项目结构非常方便。lsd -la --group-directories-first显示所有文件包含隐藏的并且目录在前。注意 Windows 下没有 Unix 那种点开头的隐藏文件概念但 lsd 会隐藏一些系统文件类似地-a可以显示它们。4. 避坑实录我踩过的五个和彩色 ls 相关的坑再好的工具落到具体环境里总会有意料之外的情况。这一节我把这几个坑的完整排查链路写出来包括现象、原因、怎么处理免得你重复走弯路。4.1 开启 VirtualTerminalLevel 之后老程序输出变乱码一开始我以为只要把VirtualTerminalLevel设为1cmd 就能全面拥抱 ANSI 颜色。结果开了之后公司内部一个老旧的批处理工具输出变得很奇怪原本正常的文字前后来了一些莫名其妙的方块字符退出 cmd 再进也一样。排查过程是这么走的先用系统还原思路把VirtualTerminalLevel改成0问题消失再改回1问题复现。由此确定是 VT 开启导致。原因在于老程序自己会往输出流里丢一些ESC字符在未开启 VT 时 cmd 只是原样把它们当普通字符打印除了偶尔出现一两个奇怪符号还不至于乱开启 VT 后cmd 会尝试把ESC后面的内容解析成控制序列一旦序列不完整或不符合规范渲染就直接乱了。这个问题的解法比较尴尬你想让 lsd 有颜色VT 必须开着你想让老程序不抽风VT 就得关。我的折中方案是保留 VT 开启老程序尽量通过 PowerShell 调用或放到独立环境里运行。如果你一定要在老程序和平共存那就只在需要看 lsd 时才临时开会话。4.2 lsd 的图标全变成方框Nerd Font 缺失刚装好 lsd第一次运行ls爽了一秒颜色有了。再看一眼目录名前全是小方框。这体验实在太掉价。但别急着骂工具这是字体问题。lsd 默认启用了文件图标功能它需要终端字体包含特定字形这类字体统称 Nerd Font。老式 cmd 窗口默认的 Consolas、新宋体根本不包含这些字形所以显示成方框。解决路径如果你不想换字体就直接在config.yaml里把icons.when改成never只保留颜色看起来依然不错。如果你想把图标也显示出来那就得装一个 Nerd Font 字体常见的有 JetBrainsMono Nerd Font、Cascadia Code NF、Meslo Nerd Font。装完后在 cmd 窗口标题栏右键进入属性、字体把字体切到对应的 Nerd Font如果是 Windows Terminal在配置文件里设置font.face即可。我个人用 Windows Terminal 比较多所以直接在settings.json里把默认字体设为 Nerd Font 了。4.3 中文文件名乱码cmd 代码页和 UTF-8 的纠缠另一个高频问题是中文文件名变成一串乱码比如正常显示“测试文件.md”结果变成“娴嬭瘯鏂囦欢.md”或者“鈥??”这种。这是因为 cmd 默认代码页是 GBK936而 lsd 输出的是 UTF-8 编码的字符串两边不匹配就乱码。最直接的解决办法是在 cmd 里执行chcp 65001把代码页切到 UTF-8然后重新打开 lsd中文基本就正常了。但要注意chcp只在当前窗口有效关掉就没了。你可以把这个命令加到 AutoRun 里但副作用是GBK 编码的老程序会在 UTF-8 代码页下乱码。另一种思路是Windows 10 2004 以后有一个系统级的“Beta: 使用 Unicode UTF-8 提供全球语言支持”选项。开启后系统非 Unicode 程序默认按 UTF-8 处理中英文环境都正常。但这是全局开关影响面大建议在虚拟机里测试确认没问题再开。对大部分场景我建议还是按需在窗口里执行chcp 65001不要全局改。4.4 doskey 宏重启就失效AutoRun 注册表值没配对这个坑很经典。我在 cmd 里配好doskey lslsd当时用得好好的一关窗口重新打开再敲ls又提示“不是内部或外部命令”。原因我在 3.2 节已经交代了DOSKEY 宏是会话级的关了窗口就没了。必须通过AutoRun注册表值在每次 cmd 启动时重新执行。如果你按我前面给的命令设置了却还是失效最可能的问题是注册表里本来就有别的工具在写AutoRun比如某些开发工具会把初始化脚本塞进去。你直接用reg add覆盖等于把别人的配置干掉了。这种时候要先去注册表里看一下当前AutoRun的值长什么样reg query HKCU\Software\Microsoft\Command Processor /v AutoRun如果有多个命令用连起来写例如conda activate base doskey /macrofile...。脚本里要注意转义cmd 对双引号的处理很敏感。改完之后单独开一个 cmd 窗口验证如果窗口一开就闪退多半是路径写错了先敲cmd /k echo test定位问题在哪一步。4.5 PowerShell 借壳方案里的引号、转义和启动时延如果你试过用doskey lspowershell -NoProfile -Command ls $*可能会发现一个更隐蔽的问题参数根本传不过去。比如你敲ls -laPowerShell 收到的参数经常是碎的甚至直接报错。原因是 cmd 的 DOSKEY 宏在展开时$*会把当前命令行剩余部分原样拼接而 PowerShell 的命令解析规则和 cmd 完全不一样。两边语法打架的时候转义就成了噩梦。更别提每敲一次ls都要等 PowerShell 引擎加载这一两秒非常磨人。所以这个方案我最终还是放弃了只在偶尔应急时用。你如果只是想看颜色不想装东西可以用真想日常用还是走 lsd。4.6 顺带一提想关掉 lsd 的 Git 状态标记怎么办最后一个不算坑但能影响体验的小问题在 Git 仓库里lsd 会在文件名旁边显示各种 Git 状态标记有的人觉得好有的人觉得吵。如果你不想要可以调整配置文件里的git相关选项。在config.yaml里找到git配置块将enabled改为falseGit 状态功能就会关闭。我自己是保留的做项目的时候一眼看出哪个文件改过效率高不少。5. 我的最终玩法Windows Terminal lsd以及几点个人经验5.1 为什么我还是建议你升级终端绕了一大圈我得说句实话单纯在原生 cmd 里折腾彩色ls上限是有的。cmd 窗口的字体渲染、Unicode 支持、配色方案都停留在上个时代即便 lsd 输出了一堆彩色字符老窗口渲染出来也略糙。而且 cmd 没有多标签页开一堆窗口找来找去也很痛苦。微软这两年干了件好事发布了 Windows Terminal。它是官方现代终端支持 GPU 加速渲染、多标签、丰富的主题配色对 ANSI 转义序列支持得比 cmd 好得多。同样一个 lsd在 Windows Terminal 里的视觉效果比在 cmd 里高一个档次。所以我在自己的主力机器上最终还是选择了“Windows Terminal lsd”的组合。cmd 依然在里面作为可选的 profile 存在但日常操作都在 Windows Terminal 里完成。之前的搜索热词里也能看到Windows 上的开发者在快速回归比如有人折腾启动 Elasticsearch、有人装 Redis Windows 版、有人用 Codex 桌面版。这些场景下终端都是绕不开的基本盘多标签的现代终端对你的效率提升绝对是实打实的。尤其是查看 Elasticsearch 的 config、logs、plugins 这些目录时lsd 的颜色和 Git 状态让你不用反复cd和type翻文件省下的时间日积月累非常可观。5.2 Windows Terminal 的最小配置示例如果你愿意试一下最省事的安装命令是winget install Microsoft.WindowsTerminal装完后打开设置编辑settings.json。几个值得关注的地方defaultProfile指定默认启动的 shell可以改成 PowerShell 7 或想用的任意 profile。profiles.defaults.font.face设置成你装的 Nerd Font 字体比如CaskaydiaCove NF。profiles.defaults.colorScheme选一个喜欢的主题比如One Half Dark、Tango Dark。如果你在 cmd profile 里通过 AutoRun 配了 lsd那进 Windows Terminal 直接启动 cmd 就能复用如果你改用 PowerShell 7可以在 PowerShell profile 里写Set-Alias ls lsd Set-Alias ll lsd -l Set-Alias la lsd -la这样在 PowerShell 里敲ls也变成 lsd体验统一。5.3 我在实际使用中的体会最后分享一点自己的真实感受。折腾这套东西前后花了不少时间最深刻的体会是别指望一个命令就能解决所有问题环境适配才是大头。lsd装好后难点全在“如何让它和 cmd 的会话机制、代码页、字体、终端渲染这些底层配置融合”。理解了 VT、AutoRun、代码页这些概念之后以后再遇到其他终端类问题基本都能顺藤摸瓜自己排查。我的日常已经习惯了在 Windows Terminal 里敲ls、ll、la偶尔切到老机器的原生 cmd还得靠doskey临时撑一下但那种“穿越回去”的感觉依然存在。彩色ls这个需求看起来小背后藏着的终端生态差异其实挺大。希望这篇文章能帮你少走点弯路一次就把 Windows 下的彩色ls配好。
返回列表