我知道一说起DOS命令,很多人第一反应就是“都什么年代了还在用这个”。但实际上,Windows的命令行环境从来没离开过我们,只是从MS-DOS时代变成了CMD和PowerShell。不管你是做运维、搞开发,还是单纯想在日常工作中提升效率,掌握基础DOS命令依然是一件回报率极高的事情。今天这篇就专门把最常用、最核心的那一批命令拆开讲透,顺便把“在Delphi程序里调用DOS命令并等待它结束”这个高频需求一并解决掉,内容不整虚的,全是能直接用的干货。无论你是刚入门的命令行新手,还是想在自动化脚本里折腾点东西的老手,这篇文章都可以当一份手边的速查手册。
1. 理解DOS命令:历史演进与核心使用场景
1.1 从DOS到CMD:命令行的进化路径
DOS全称是Disk Operating System,也就是磁盘操作系统。当年的Windows还是跑在DOS之上的图形外壳,用户真正操作计算机的入口其实就是这行黑底白字的命令提示符。后来Windows NT内核出现,操作系统彻底图形化,“DOS命令”这个词严格来说已经变成了历史名词,但Windows为了解决兼容性和管理需求,保留了命令行解析器,也就是我们常说的CMD(Command Prompt)。
很多人会纠结“CMD是不是DOS”这个问题。从技术底层看,CMD是32位/64位的Windows应用程序,负责把用户输入的文本命令解析成系统调用,它和上世纪那个单任务、实模式的MS-DOS完全是两个东西。但从使用方式上,CMD继承和兼容了绝大部分DOS命令语法,所以我们习惯上仍然管这一套叫做“DOS命令”。理解这一点很重要,因为你在CMD里敲的dir、copy、del,实际上是在和Windows API打交道,而不是真的在跟某个古老的系统交互。
Windows后来又引入了PowerShell,功能比CMD不知道强到哪里去了,但CMD还是没有被替代掉,原因有几个:一是大量存量脚本和运维流程还在用批处理,改造成本高;二是很多系统的精简安装环境(比如PE、WinRE)只提供CMD;三是CMD命令本身就是学习PowerShell和Shell编程的底层基础,语法逻辑一通百通。所以,别觉得学这些“过时”的东西没用,它恰恰是理解现代系统命令行工具的钥匙。
1.2 什么人还在用DOS命令,解决什么问题
我接触过的场景里,还在用DOS命令的基本可以分成三类人。
第一类是系统运维和网络管理员,他们日常要在服务器上快速查端口、查进程、配IP、做磁盘管理。Windows Server没有图形界面的时候(比如Server Core模式),唯一的操作入口就是CMD,这时候不会命令就寸步难行。
第二类是开发和测试工程师,经常要写批处理脚本做自动化构建、定时清理日志、启动依赖服务,或者在代码里调用外部命令行工具。我在做Windows桌面应用开发的时候就经常遇到这种需求,后面会专门讲Delphi调用DOS命令的实现方式。
第三类是普通办公用户,主要是为了高效处理一些重复性操作。比如批量改文件名、批量压缩日志、定时关机、一键清理临时文件,这些用图形界面操作很繁琐,但两三行命令就能搞定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 打开命令行的正确姿势
2.1 快速打开CMD的几种方法
不管你是Windows 7还是Windows 11,打开CMD都有很多种方式。我自己最常用的几个:
- 快捷键Win + R,输入cmd,回车。这是最快的方式,输入完直接进。
- 在文件资源管理器地址栏直接输入cmd,回车。这个技巧特别适合想在当前目录下开命令行的情况,省去了切盘符和cd的麻烦。
- Win + X菜单(或者右键开始按钮),选择“Windows PowerShell”或者“命令提示符”。系统版本不同,显示名字可能不一样,但本质是一样的。
- Shift + 右键资源管理器空白处,选择“在此处打开命令行窗口”(Win10 1803之后默认变成了PowerShell,但习惯用CMD的话可以通过设置改回来)。
这里有一个实用的建议:如果你需要在某个特定目录下执行命令,最好先打开资源管理器,导航到目标目录,然后在地址栏输入cmd。这样命令行启动时的工作目录就是当前路径,省了反复cd的时间。特别是路径很长的时候,手动敲cd容易打错,还是这个方式最准。
2.2 窗口配置与常用快捷键
CMD窗口默认是黑底白字,看起来确实有点“复古”,但它并不是不能配置。右键点击窗口标题栏,选“属性”,在“颜色”标签页里可以改背景色和文字色,在“字体”里可以调节字号。我把默认字体改成了Consolas + 16号字,长时间看代码和日志舒服很多。
快捷键这块,有几个是必须掌握的:
- Ctrl + C:终止当前正在执行的命令,这个关键时刻能救命。
- Ctrl + V / 右键粘贴:CMD默认右键就是粘贴,不需要快捷键。
- F7:呼出命令历史列表,可以用方向键选择以前执行过的命令。
- 上下方向键:快速切换历史命令,减少重复输入。
- Tab:自动补全路径和文件名,Windows的补全是智能的,按一次补全一个候选,多按几次可以在多个匹配项之间切换。
还有一个很多人不知道的:快速全选文本。右键点标题栏 -> 编辑 -> 标记,然后拖动鼠标就能选文本;更快的办法是直接按Ctrl + A全选缓冲区内所有内容(Windows 10以后支持)。复制命令输出时这个操作特别实用。
2.3 命令解析过程与帮助系统
要知道一条命令是怎么被“翻译”成机器动作的,关键是理解命令行解析器的查找顺序。当你输入一条命令,CMD首先检查它是否内部命令(比如dir、cd、copy),系统内部命令不用去磁盘上找文件,直接由内置逻辑执行。如果不是内部命令,CMD会在当前目录和系统PATH环境变量里查找对应的可执行文件(.exe、.bat、.cmd等)。
这一点在开发中很重要,因为经常会出现“命令找不到”或者“找到的是老版本”的情况。解决方法是优先使用绝对路径,或者在命令前加上.\指定当前目录。如果你装了多个版本的某个工具(比如Python、Java),命令行执行的可能是PATH里排在前面的那个,跟你的预期不一样,排查的时候就要先想到是不是路径优先级的问题。
不记得某个命令的用法也很正常,不用着急去搜索引擎,先试试命令自带的帮助参数。绝大多数命令都支持/?或者-h,比如dir /?,系统会把所有参数和示例输出到屏幕上。Windows命令的帮助信息写得还算清楚,至少能让你回忆起大致的用法。
3. 常用命令分类详解:文件与目录操作
3.1 目录管理:dir、cd、md、rd
dir是DOS时代用最多的目录列出命令,在Windows CMD里功能依然强大。直接输入dir列出当前目录的文件和子目录,加上/w可以宽行显示,/p可以分页显示。我实战中经常用的是dir /a,这个参数会显示包括隐藏文件在内的所有文件,排查目录内容时少踩坑。
cd切换目录,这个几乎是每个命令行的第一课。有两个细节值得注意:第一,cd ..回到上一级目录,cd \回到当前盘符根目录;第二,如果要从C盘切到D盘某个目录,不能直接cd D:\working,得先输入d:切换盘符,再cd working。这个坑几乎所有初学者都踩过。
md(mkdir)创建目录,支持一次创建多级目录,比如md a\b\c,会递归创建a、b、c三级路径,不用一层层建,效率高很多。相应地,rd(rmdir)删除目录,默认只能删空目录,如果想连文件带子目录一起删,要加/s参数,比如rd /s /q temp,其中/q表示安静模式,不逐个确认。这里我真心提醒一句,rd /s /q是危险程度比较高的操作,删错就找不回来了,执行前一定确认路径没问题。
3.2 文件管理:copy、del、ren、move、xcopy
copy是最经典的文件复制命令,基本格式是copy 源文件 目标位置。要注意的是,如果目标位置只给目录路径,会保留原文件名;如果给了完整文件名,会重命名。copy还有一个隐藏功能:合并文件。比如copy 1.txt + 2.txt 3.txt,会把1.txt和2.txt的内容拼接输出到3.txt。这是很早以前用来手工合并文本和日志的土办法,现在用的人少了,但了解一下没坏处。
del删除文件,支持通配符,比如del *.log删除当前目录所有log后缀文件。加/f可以强制删除只读文件,/q安静模式。坦白说,del配合通配符是清理临时文件的好帮手,但同样要小心:通配符不一定按你想象的匹配,比如del *会把所有文件都删光,别问我怎么知道的。
ren重命名文件,格式是ren 旧名 新名。注意ren只能改当前文件的名字,不能跟路径混着用,跨目录改名的场景要用move。move除了移动文件,还能给文件改名:move 旧路径\1.txt 新路径\2.txt,等于移动加重命名一步到位,批处理里经常这么干。
xcopy是copy的增强版,可以递归复制整个目录树。基本用法xcopy 源目录 目标目录 /e /i /y,/e复制所有子目录(包括空目录),/i如果目标目录不存在就自动创建,/y覆盖时不询问。现在微软官方更推荐robocopy,功能更强,支持多线程复制和断点续传,但xcopy作为基础技能还是要掌握,因为它轻量、覆盖范围广,很多老脚本都是基于它的。
3.3 文本处理:type、find、sort、more
type是最简单的文本查看命令,type filename直接把文件内容打到屏幕上。文件小的时候没问题,文件大了刷屏刷得你怀疑人生,这时候要配合more命令,type bigfile.txt | more就会逐屏显示,按空格翻页,按q退出。
find是文本搜索命令,功能虽然不能跟grep比,但基本够用。find "error" application.log就能在日志文件里找包含error的行。加/n显示行号,/c只统计匹配行数,/v显示不包含关键字的行(也就是反向匹配)。做日志排查的时候,这几个参数组合起来效率非常高,比如你想统计日志里有多少条error,一条find /c "error" app.log就出结果。
sort用来对文本行排序。默认按字典序,加/r反向排序,/n按数值排序(注意,如果文件里有数字,不加/n会让10排在2前面)。配合重定向符号能把排序结果输出到文件:sort list.txt /o sorted.txt,这算是比较轻量的数据处理手段了。
4. 常用命令分类详解:系统管理与网络排查
4.1 系统信息:systeminfo、tasklist、taskkill、shutdown
systeminfo是查看系统配置信息的神器,一条命令把操作系统版本、主机名、制造商、BIOS版本、物理内存、系统目录、补丁列表全列出来。做资产盘点的时候特别有用,以前我维护一批Windows服务器,每次收集环境信息都是靠systeminfo > info.txt批量导出。
tasklist列出所有正在运行的进程,类似任务管理器但更方便做文本处理。tasklist /svc可以查看每个进程对应的系统服务,tasklist /fi "imagename eq chrome.exe"按镜像名过滤进程列表。配合taskkill使用,可以远程杀掉卡死的进程:taskkill /f /im notepad.exe强制结束所有记事本进程,taskkill /f /pid 1234按进程号杀。在做自动化测试的时候,清理残留进程这个组合是我用得非常频繁的操作。
shutdown用于关机/重启,很多人知道它能一键关机,但不知道它可以定时、远程、带备注。shutdown /r /t 60表示60秒后重启,shutdown /s /t 0立即关机,shutdown /a取消正在进行的关机计划。加/m \\计算机名可以远程关其他机器,这在机房维护时会用到。写批处理脚本做自动化部署时,最后一步经常就是shutdown /r /t 10让系统自动重启完成安装。
4.2 网络排查:ipconfig、ping、tracert、netstat
ipconfig是网络排查第一步。直接执行显示当前机器所有网卡的IPv4地址、子网掩码和默认网关。ipconfig /all显示更多细节,包括MAC地址、DHCP是否开启、DNS服务器。ipconfig /flushdns清空DNS缓存,这个命令在域名解析异常时急救特别好使,比刷新网卡重启快多了。
ping是最基础的连通性测试命令。但很多人只会ping 域名,不知道几个实用参数:ping -t持续ping直到手动停止,适合长时间监控网络稳定性;ping -n 10指定ping 10次;ping -l 1400指定发送数据包大小,可以测试MTU问题。判断网络质量的时候,除了看通不通,还要看延迟和丢包率,如果丢包率高于1%,基本可以认定网络链路有问题了。
tracert是路由追踪命令,可以查看数据包从本机到目标地址经过了哪些路由节点。格式是tracert -d 目标地址,-d参数禁止反解析域名,速度会快很多。它能帮你定位是哪个节点网络慢或者不通,做跨网段问题排查时必用。
netstat查看网络连接状态,无可争议的排障神器。netstat -ano列出所有活动连接、监听端口和对应的进程PID,netstat -an | findstr 8080查看特定端口被谁占用。开发的时候经常碰到“端口被占用”的问题,我都是用这条命令找出PID,再tasklist | findstr PID查是哪个进程,然后决定是杀掉还是换端口。
4.3 其他必须掌握的杂项命令
taskmgr一键打开任务管理器,msconfig打开系统配置工具,regedit打开注册表编辑器,notepad打开记事本。这几个严格来说不算DOS命令,但一旦在CMD里用习惯了,比去开始菜单翻找快得多。
where命令的作用是查找可执行文件的位置,格式where cmd会返回C:\Windows\System32\cmd.exe。当系统装了多版本Python或Java,找不到实际调用的是哪一个时,用where python立刻见分晓。
set查看和设置环境变量。直接输入set列出所有环境变量,set PATH只显示PATH变量,set MY_VAR=test设置临时变量(仅在当前CMD窗口生效)。批处理脚本中经常用这个方式定义临时参数,用完不污染系统环境。
5. 自动化与批处理:让DOS命令连起来跑
5.1 重定向与管道:>、>>、| 的实际用法
单条命令能力有限,但命令组合起来就是千军万马。重定向和管道就是组合的粘合剂。
>把命令输出写入文件,会覆盖原内容。echo hello > 1.txt就把hello写入了1.txt。>>是追加模式,不清空原有内容,适合持续写入日志。2>专门重定向错误输出,比如dir nonexist 2> error.txt,错误信息会写到error.txt而不会刷在屏幕上。更高级的2>&1可以把标准输出和错误输出合并到同一个流,这个在日志记录时很重要,不然报错信息看不到。
管道符|把前一个命令的输出作为后一个命令的输入。dir | findstr "txt"在dir结果里搜索包含txt的行,ipconfig | findstr /i "ipv4"快速列出所有IPv4地址。管道和findstr的组合是我日常使用频率最高的操作之一,等于给任意命令加了个过滤能力。
注意一个细节:CMD里管道和重定向的解析顺序是固定的,有时候你会写出“感觉逻辑对但结果不对”的命令,多半是没分清输入输出流。遇到这种问题,建议拆成两步,先重定向到临时文件,再处理临时文件,虽然多一步但逻辑清晰。
5.2 批处理脚本入门:变量、条件、循环
批处理文件是纯文本文件,后缀为.bat或.cmd,里面一行行写命令,双击就能执行。入门很简单,但要用好需要掌握几个基本语法。
变量定义用set VAR=value,引用用%VAR%。比如:
batch复制set target_dir=D:\logs
echo Start backup to %target_dir%
条件判断用if,最常用的是比较字符串和判断文件是否存在:
batch复制if exist "C:\temp\flag.txt" (
echo Flag exists
) else (
echo Flag not found
)
循环用for,批处理的for语法比较绕,但极为强大。批量重命名文件可以这样:
batch复制for %f in (*.txt) do ren "%f" "prefix_%f"
注意在批处理文件里写for变量要用%%i(两个百分号),直接在命令行敲则用一个%i,这个坑几乎人人都会踩。
脚本里加@echo off可以关闭命令回显,让输出更干净;加pause在脚本末尾暂停,方便查看执行结果。调试批处理最痛苦,我建议在关键步骤加echo打印当前变量值,定位问题会快很多。
5.3 定时与计划任务的简单实现
CMD里没有直接的sleep命令(PowerShell有Start-Sleep),但在批处理里调用ping -n 6 127.0.0.1 > nul可以实现延迟约5秒的效果(实际是ping了5次,每次都等待超时)。虽然这个写法看起来有点野路子,但在老环境中它就是能用。
如果需要真正的定时任务,应该使用Windows任务计划程序,命令行入口是schtasks。创建每天凌晨2点运行的日志清理脚本:
batch复制schtasks /create /tn "DailyLogClean" /tr "D:\scripts\clean.bat" /sc daily /st 02:00
/sc指定频率(daily、weekly、monthly等),/st指定开始时间,/tr是要运行的程序。这个命令在无人值守的自动化部署中非常有用,不用去任务计划程序界面里点来点去,一条命令就搞定了。
6. 高级场景:Delphi中运行DOS命令并等待其结束
6.1 为什么程序里要调用DOS命令
很多桌面应用在运行时会需要执行外部命令行工具,常见的场景包括:调用FFmpeg做音视频转换、调用压缩工具做文件归档、执行系统命令收集诊断信息、调用外部脚本做数据转换。Delphi作为老牌原生Windows开发工具,在这方面提供了很多种实现方式,但选择不同,效果天差地别。
最容易踩坑的做法是用WinExec,它是16位时代的遗留物。WinExec的问题是它不等待程序结束,函数立即返回,你要检测执行结果就得自己轮询进程是否存在,非常麻烦。
稍微好一点的是ShellExecute,它能打开文件、调用默认程序,甚至提权运行,但它默认也是异步的,不会等待外部程序结束。想要实现“执行并等待完成”这个需求,最可靠的方案是用Windows API里的CreateProcess函数。
6.2 用CreateProcess实现等待结束
CreateProcess是Windows下创建子进程的核心API,参数比较复杂,但用起来其实挺直接。Delphi的封装代码如下:
delphi复制function RunAndWait(CommandLine, WorkDir: string; WindowState: Word): Integer;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdStr: array[0..MAX_PATH] of Char;
CurDir: array[0..MAX_PATH] of Char;
begin
FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := WindowState;
if WorkDir <> '' then
StrPCopy(CurDir, WorkDir)
else
CurDir[0] := #0;
StrPCopy(CmdStr, CommandLine);
if not CreateProcess(nil, CmdStr, nil, nil, False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil, @CurDir, StartInfo, ProcInfo) then
RaiseLastOSError;
try
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcInfo.hProcess, Cardinal(Result));
finally
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
原理解释一下:首先填充TStartupInfo结构体,STARTF_USESHOWWINDOW和wShowWindow := SW_HIDE可以实现隐藏命令行窗口的效果,让外部命令在后台静默运行,不会突然弹一个大黑窗干扰用户。然后调用CreateProcess创建进程,关键在于后面的WaitForSingleObject(ProcInfo.hProcess, INFINITE):这里等的是进程句柄,只有目标进程退出,这个API才会返回,从而实现了“等待结束”。
补充一下,GetExitCodeProcess拿到的退出码,0一般表示成功,非0表示有错误。很多命令行工具会返回约定的错误码,这可以作为判断执行结果的重要依据。
6.3 用ShellExecute方式的替代方案
如果不想处理CreateProcess的一大堆结构体,也可以用ShellExecuteEx配合SEE_MASK_NOASYNC标记来实现等待。ShellExecuteEx本身支持同步等待选项,不过它优先级不保证是精确等待,且对输出捕获支持不如CreateProcess灵活。
第三个方式是调用CMD的/c参数,比如cmd.exe /c ping -n 3 127.0.0.1,这个方式本质上还是通过CreateProcess创建的,只是把命令丢给了cmd解释器执行。它的便利之处是可以直接执行带管道和重定向的复杂命令行,但代价是命令字符串更容易出现转义和引号嵌套问题。
这里最大的经验是:如果你需要“精确等待 + 获取退出码 + 有隐藏窗口”这三项,直接上CreateProcess最省心。如果只是简单调个程序打开文件,不关心结束状态,用ShellExecute就行。
6.4 输出捕获与超时控制
很多场景下,你不光要知道外部命令是否执行完,还想拿到它的标准输出和标准错误输出,为此需要创建管道。创建管道的核心思路是用CreatePipe建立一对句柄,把TStartupInfo中的hStdOutput和hStdError指向管道,然后子进程的输出就会写到管道里,父进程从另一端读取。
这部分代码量比较大,我非常建议大家直接在项目里引入JEDI JCL库里的TJclProcess类,它把进程创建、输出捕获、等待结束这些都封装好了,省下大量重复工作。JCL的做法是内部用线程持续读取管道内容,避免主线程阻塞导致界面卡死,这是Delphi中处理外部进程的成熟方案。
超时控制也是一定要做的,不然外部命令可能因为某些原因挂死,程序就永远卡在WaitForSingleObject上。把INFINITE改成具体毫秒值,比如WaitForSingleObject(ProcInfo.hProcess, 30000),如果返回值是WAIT_TIMEOUT则可以提示用户或强制终止进程。这个在跑网络命令和可能打锁的脚本时尤为重要。
6.5 常见问题:隐藏窗口、路径空格、权限问题
这三个坑在Delphi调用命令行时出现的频率最高,挨个说一遍。
第一,隐藏窗口。有些命令行工具是控制台程序,不设置隐藏就会弹窗。上面代码里SW_HIDE可以实现,但要注意控制台程序经常调用AllocConsole自己创建新的标题栏窗口,光设置StartInfo可能不够,这时需要额外处理。
第二,路径空格。这是最常见的问题。D:\My Program\app.exe这种带空格的路径直接传入CreateProcess大概率会失败,或者只截取到空格前面的部分。解决办法是把整个命令行参数用引号包起来:'"D:\My Program\app.exe" -param value'。本质上跟手动在CMD里输入命令时加引号是同一个道理。
第三,UAC权限。普通权限的程序启动不会提示UAC的系统命令时,可能因为权限不足而静默失败或功能受限。这时需要提升自身程序权限(manifest里设置requireAdministrator),或者用ShellExecuteEx带runas动词触发UAC提权。注意,CreateProcess无法直接请求提权,这是它的天然限制。
7. 常见问题与排查技巧速查表
-
问题:提示“不是内部或外部命令,也不是可运行的程序或批处理文件”
原因:命令拼写错误、命令不在当前目录、系统PATH里没有安装目录。
处理:先用where 命令名确认它在不在;如果命令确实安装了但找不到,用绝对路径执行。 -
问题:路径或文件名中有空格,命令执行失败
原因:命令行解析器把空格当成了分隔符。
处理:所有含空格的路径必须加双引号,这是命令行铁律。 -
问题:CMD窗口中中文显示乱码
原因:代码页不匹配,默认可能是GBK代码页,遇到UTF-8编码输出就会乱。
处理:执行chcp 65001切换到UTF-8代码页,或chcp 936切回GBK。注意切换后可能影响旧程序输出,需要按脚本情况决定。 -
问题:批处理执行时黑窗一闪而过,没看到结果
原因:脚本里没有pause或者被其他窗口覆盖。
处理:在脚本末尾加pause,或者用cmd /k方式手动运行脚本调试。 -
问题:命令一直执行不完,没有退出
原因:命令在等待用户输入,或者死循环、网络超时。
处理:检查命令是否缺少必要的参数,必要时用Ctrl+C强制中断。 -
问题:del等命令误删了文件
原因:通配符使用不当或路径配置错误。
处理:先dir列出匹配的结果,确认无误再用del执行;重要文件及时备份。 -
问题:Delphi调用后界面卡死
原因:在主线程里同步等待外部进程结束,导致界面消息循环阻塞。
处理:用线程封装等待逻辑,或用JCL的TJclProcess异步回调方式。 -
问题:CreateProcess执行外部命令没有输出
原因:没有建立输出管道,子进程的标准输出默认指向当前控制台,而当前程序可能没有控制台。
处理:显式创建管道并手动读取子进程输出,或者重定向到临时文件后再读取。
提示:排查命令行问题时,建议先手动在CMD里执行一遍完整命令,确认命令本身没问题,再搬进代码或批处理脚本里。大部分诡异问题其实出在命令的拼接、转义和引号处理上,而这些问题在手动执行时一眼就能看出来。
我个人在实际操作中的体会是:DOS命令就像一把多用途的瑞士军刀,平时可能用不上几次,但关键时刻它的效率远超图形界面的点击操作。特别是把命令组合成批处理脚本,或者嵌入到自己的桌面应用里,那种一次投入、反复复用的成就感,确实让你觉得当年的学习时间没有白花。另外,常用命令的参数细节比较多,一次记不全很正常,建议把这份内容收藏起来,配上命令自带的/?帮助,大概率能解决日常工作里绝大部分命令行场景。
