鼠标突然失灵、远程桌面卡死、某个端口怎么也释放不掉,这时候你才会发现:平时点得顺手的图形界面,在故障现场往往是最先罢工的。反而是那些看起来“古董”的Windows CMD命令,一条一条敲下去,能把系统从半瘫痪状态捞回来。这篇内容就是把我在日常运维和装机调试里反复用到的100个CMD命令系统整理了一遍,按文件、网络、系统、磁盘、脚本五个方向分类,配着实际排查思路和几个能直接抄作业的批处理脚本,给经常在Windows上干活的人当一份速查手册。不管你是刚接触命令行的新手,还是已经习惯用PowerShell的老手,这里都会有几个你可能忽略但非常实用的操作点。
1. 为什么图形界面时代还要回头学CMD
先说个我自己的例子。前段时间一台机器的存储池报掉盘,打开磁盘管理界面转圈转了两分钟,最后直接白屏。我切到CMD,用diskpart和wmic把物理磁盘状态、池内成员盘健康度一条条拉出来,不到五分钟就定位到是一块SATA盘固件挂了。这种场景经历过几次之后,我对CMD的态度就从“老古董”变成了“保命工具”。
图形界面最大的问题是把操作藏在了层级菜单背后。你想查一个端口占用,开任务管理器、切到详细信息、找PID、再到命令行去kill,来回折腾好几步。而一条netstat -ano | findstr :8080加taskkill /PID xxx /F就能解决。诊断、定位、处理,全程不用离开终端窗口。
另外,很多服务和工具的安装、启动、升级,官方文档里给的首选方式就是命令行。比如Windows上启动Elasticsearch,解压之后进bin目录跑elasticsearch.bat;装Docker Desktop用winget install Docker.DockerDesktop;Git、MySQL、RabbitMQ这些软件的静默安装参数也基本都是在CMD里执行的。图形界面的安装向导虽然友好,但每次配置都得手动点,批量部署几十台机器的时候完全不可行。
还有一个原因:CMD是Windows系统自带、换台机器就能用的。公司内网的机器不一定有管理员权限装PowerShell插件,但打开cmd.exe从来不会被拦。脚本写得干净一点,拷过去就能跑,不需要额外运行时。这在应急处理和跨机器巡检时优势非常大。
当然,PowerShell在很多场景里确实比CMD强,对象管道、远程管理、模块化都要更现代。但如果只是查日志、清端口、看磁盘、启停服务、跑批处理,CMD依然是最轻量可靠的选择。我的习惯是:能用CMD解决的问题,不升级到PowerShell;PowerShell更适合处理复杂对象和抽象逻辑。两者不是替代关系,是按场景选工具的关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 100个命令按五张清单分类整理,用到的时候直接查
下面这五张表对应文件、网络、进程服务、磁盘存储、脚本控制五个方向,一共100条,是我平时用得最多也最推荐优先掌握的CMD命令集合。每条命令的名称和用途一目了然,后面我会挑几条容易踩坑或者被低估的单独展开。
2.1 文件与目录操作:20条
| 命令 | 用途 |
|---|---|
| dir | 列出目录内容 |
| cd | 切换当前目录 |
| md | 创建目录 |
| rd | 删除目录 |
| copy | 复制单个或多个文件 |
| xcopy | 复制目录树,支持更多参数 |
| robocopy | 强大多目录镜像同步,适合备份 |
| move | 移动文件或目录 |
| ren | 重命名文件 |
| del | 删除文件 |
| erase | 等价于del,删除文件 |
| type | 查看文本文件内容 |
| fc | 比较两个文件差异 |
| find | 在文件中查找字符串 |
| findstr | 增强版文本查找,支持正则 |
| where | 在PATH路径中定位程序位置 |
| tree | 以树状图显示目录结构 |
| attrib | 查看或修改文件属性 |
| expand | 解压CAB压缩包 |
| compact | 显示或修改NTFS压缩状态 |
这里我最想提一下robocopy。很多人备份文件夹还在用copy或者xcopy,但robocopy支持多线程、断点续传、增量同步,复制大目录时效率高得多。比如镜像整个网站根目录到备份盘,robocopy D:\site E:\backup\site /MIR /MT:16 /LOG:backup.log,加/MIR会镜像删除源端不存在的文件,适合做完整同步,但第一次用一定要小心,别把目标目录里残留的文件误删了。
2.2 网络诊断与连接管理:20条
| 命令 | 用途 |
|---|---|
| ipconfig | 查看IP地址、DNS、网卡信息 |
| ping | 测试目标连通性 |
| tracert | 跟踪数据包路由路径 |
| pathping | 结合ping与tracert,统计丢包率 |
| nslookup | 查询DNS解析结果 |
| netstat | 查看端口、连接、路由表 |
| route | 查看或修改路由表 |
| arp | 查看或修改ARP缓存 |
| netsh | 强大的网络配置工具 |
| ssh | 远程登录Linux或Windows主机 |
| telnet | 测试远程TCP端口是否开放 |
| ftp | 命令行FTP客户端 |
| getmac | 查询本机MAC地址 |
| hostname | 显示计算机名 |
| net use | 映射或删除网络驱动器 |
| net share | 管理共享目录 |
| net view | 查看局域网共享资源列表 |
| whoami | 显示当前用户名和权限 |
| systeminfo | 查看系统详细配置信息 |
| winrm | 配置Windows远程管理服务 |
网络排查的一般顺序是:先ipconfig确认本机IP和网关,再ping网关判断链路通断,接着tracert看路由在哪一跳丢包,最后用nslookup验证域名解析。telnet IP 端口是个老办法,但现在依然管用——连不上端口就证明服务没起来或被防火墙挡了,很多Windows机器默认没开telnet客户端,但CMD里telnet命令是在“启用或关闭Windows功能”里勾上就能用的。
2.3 进程、服务与系统配置:20条
| 命令 | 用途 |
|---|---|
| tasklist | 列出当前进程列表 |
| taskkill | 按名称或PID终止进程 |
| sc | 查询、创建、停止系统服务 |
| net start | 启动Windows服务 |
| net stop | 停止Windows服务 |
| wmic | 查询硬件、系统、进程等WMI信息 |
| driverquery | 列出已安装驱动 |
| shutdown | 关机、重启、注销,支持定时 |
| logoff | 注销当前会话 |
| schtasks | 创建和管理计划任务 |
| reg | 直接读写注册表 |
| set | 查看或设置当前环境变量 |
| setx | 永久设置环境变量 |
| path | 显示或修改PATH环境变量 |
| ver | 查看Windows版本号 |
| sfc | 扫描并修复系统文件 |
| mrt | 启动恶意软件删除工具 |
| cipher | 加密或解密NTFS文件 |
| runas | 以其他用户身份运行程序 |
| start | 启动程序或打开文件 |
tasklist和taskkill组合是杀进程的标准动作,但要注意taskkill /F强制结束进程时如果有未保存的数据会直接丢,先尝试不带/F的温和结束。sc和net start / net stop是管理服务的两种风格,sc支持的服务操作更多,比如sc config wuauserv start= disabled可以禁用Windows更新服务,等号后面必须有空格,这是老命令的怪脾气,记不住就会报语法错误。
2.4 磁盘、存储与系统恢复:20条
| 命令 | 用途 |
|---|---|
| diskpart | 磁盘分区管理 |
| chkdsk | 检查磁盘错误并修复 |
| defrag | 碎片整理 |
| cleanmgr | 启动磁盘清理工具 |
| format | 格式化磁盘分区 |
| label | 创建、修改或删除卷标 |
| vol | 显示磁盘卷标和序列号 |
| subst | 将目录映射为虚拟盘符 |
| fsutil | 文件系统高级管理 |
| vssadmin | 管理卷影副本 |
| wbadmin | 备份与恢复系统 |
| reagentc | 配置Windows恢复环境 |
| bootrec | 修复引导记录 |
| bcdedit | 管理启动配置数据 |
| mbr2gpt | 将MBR分区转为GPT |
| convert | 将FAT/FAT32卷转为NTFS |
| mountvol | 创建、删除或列出卷挂载点 |
| recover | 从损坏磁盘恢复文件 |
| diskshadow | 管理卷影副本服务 |
| verify | 控制写入校验开关 |
diskpart是分区操作里的“手术刀”,执行破坏性操作前一定要反复确认磁盘编号。diskpart进入自己的交互环境后,list disk、select disk 0、list partition、clean这些子命令分别对应查看、选择、清空,其中clean是直接抹掉整块盘,不可恢复。chkdsk /f /r修硬盘时如果目标分区正在使用,会提示重启后检查,这是正常的。另外mbr2gpt只能在Win10 1703以上的系统用,而且要确保磁盘分区和引导正常,转之前最好先bcdedit /enum确认引导状态。
2.5 脚本控制与批处理基础:20条
| 命令/符号 | 用途 |
|---|---|
| goto | 跳转到指定标签 |
| call | 调用另一个批处理 |
| pushd | 保存当前目录并切换 |
| popd | 恢复pushd保存的目录 |
| for | 循环遍历集合 |
| forfiles | 按时间批量操作文件 |
| if | 条件判断 |
| choice | 等待用户选择 |
| timeout | 延时等待 |
| pause | 暂停并等待按键 |
| sort | 对输入排序 |
| more | 分页显示内容 |
| mode | 配置设备参数 |
| clip | 输出重定向到剪贴板 |
| doskey | 命令行历史与宏定义 |
| echo | 输出文本或控制回显 |
| > >< | 输出重定向操作符 |
| | | 管道操作符 |
| && | 前一条成功才执行后一条 |
| || | 前一条失败才执行后一条 |
这20条是写批处理的地基。for看上去吓人,其实是批处理里最值钱的一条,后面我会专门给一个例子。&&和||组合可以在一条命令里完成“成功则继续、失败则处理”的逻辑,比如ping -n 1 10.0.0.1 >nul && echo 通了 || echo 不通,省掉了写if的麻烦。
3. 高频故障现场:端口被占、存储池掉盘、启动项异常,三步定位根因
很多Windows用户遇到问题第一反应是装鲁大师、卸载重装,其实一半以上的系统异常都可以用CMD在终端里快速判断。这里说几个我处理过很多次的现场。
3.1 端口被占用的完整定位链路
本地起服务时报端口被占用,是最经典的CMD排查场景。假设我要启动的Elasticsearch默认使用9200端口,结果报错说端口被占用。先确认监听状态:
bash复制netstat -ano | findstr :9200
输出可能长这样:
text复制TCP 0.0.0.0:9200 0.0.0.0:0 LISTENING 12832
最后一列是PID 12832,再用tasklist查这个PID对应什么进程:
bash复制tasklist /FI "PID eq 12832"
如果确认是旧进程,直接结束:
bash复制taskkill /PID 12832 /F
这里有个容易被忽略的点:netstat -ano会把带TIME_WAIT状态的连接也列出来,如果findstr出来的行状态不是LISTENING而是TIME_WAIT,说明端口只是短暂占用,等一两分钟自动释放就行,没必要强制kill,反而可能影响正在收尾的数据连接。另外,用/FI过滤PID时,tasklist会区分PID还是映像名称,写法是/FI "PID eq 12832",注意大小写和等号两侧的空格。
3.2 存储池成员盘掉盘的容错处理
Windows的存储池在图形界面里看着很直观,但一旦出现“降级”或“掉盘”,界面经常卡在扫描状态。CMD配合WMI可以快速看物理盘健康度:
bash复制wmic diskdrive get status,model,serialnumber
查看存储池相关状态需要用到PowerShell的Storage模块,但CMD可以通过powershell -Command直接调:
bash复制powershell -Command "Get-StoragePool -IsSystem $false | Format-List FriendlyName,OperationalStatus"
如果确认是某块物理盘被移出,先看池状态,再执行Get-PhysicalDisk确认哪块盘状态是Unhealthy或Removed。处理策略一般是:先确认不是连接线松动,然后从池中移除坏盘,换上健康盘后再执行Repair-StoragePool。整个过程里,vssadmin list shadows可以顺带检查卷影副本是否正常,避免数据恢复时才发现没有备份点。
3.3 开机启动项里藏的东西
很多软件会往注册表的Run键里塞启动项,任务管理器的“启动”页还能看到,但有些计划任务性质的启动项不显示在那里。CMD下直接查注册表更彻底:
bash复制reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"
想查计划任务里可疑的启动项,用schtasks配合过滤:
bash复制schtasks /query /fo CSV | findstr /i "unknown"
/fo CSV输出格式适合在CMD里管道处理,/v参数能看到更详细信息。查出来确实是垃圾软件创建的启动项,先用schtasks /delete /tn 任务名 /f删除,再reg delete清注册表键值。注意改注册表前先reg export备份一下,别为省事丢了数据。
3.4 关闭系统更新服务,但别关错地方
关于“关闭Windows更新”,网上很多教程让直接禁用wuauserv服务,我也确实经常这么做,但要说清楚后果。禁用更新服务后,Microsoft Store应用可能无法正常下载更新,部分依赖Windows Update API的软件会报错。命令行方式:
bash复制sc config wuauserv start= disabled
net stop wuauserv
如果之后想恢复,把disabled改回auto,再net start wuauserv就行。还有,Win10/11的更新还会受UsoSvc(Update Orchestrator Service)影响,有些人禁了wuauserv发现还是能检查更新,多半是没把这个服务也停掉。操作前先sc query usosvc看一眼状态,双服务一起管才干净。
3.5 安全日志和恢复环境
想快速查看最近的安全登录日志,CMD里用wevtutil:
bash复制wevtutil qe Security /c:20 /rd:true /f:text | findstr /i "登录 审核"
/rd:true表示按最新时间倒序,/c:20只取20条,避免日志文件太大导致输出刷屏。系统引导出问题时,用reagentc检查恢复环境是否正常:
bash复制reagentc /info
如果显示Windows RE状态: Enabled,说明WinRE正常;如果被精简系统或工具禁用,执行reagentc /enable重新开启。这台机器的WinRE分区如果损坏,网上下的所谓“恢复镜像”其实很多就是在折腾这个分区,本质上就是一条命令的事。
4. 用CMD部署软件和模型服务,比双击向导舒服得多
很多部署任务在图形界面下要做五六步选择,命令行一条命令就能带参数跑完。这里挑几个常见的场景展开。
4.1 Elasticsearch、MySQL、RabbitMQ等服务的启动与注册
启动Elasticsearch,进到解压目录后执行:
bash复制cd /d D:\elasticsearch-8.12.0\bin
elasticsearch.bat
首次启动可能会提示“es.enforce.bootstrap.checks”相关安全配置或内存不足,先把jvm.options里的堆内存调小,再用cmd的普通终端启动。还有一个容易被误导的问题:如果是从某个管理终端或提升权限的终端启动服务,部分后台程序会报“daemon from a non-elevated terminal”之类的提示,这通常不是ES本身的问题,而是有些客户端组件不允许在管理员权限下运行。遇到这种报错,换个普通权限的CMD窗口启动就好。
MySQL安装到Windows服务也建议用命令而不是向导:
bash复制mysqld --install MySQL --defaults-file="D:\mysql\my.ini"
net start MySQL
RabbitMQ装完服务后,在sbin目录下执行:
bash复制rabbitmq-service install
rabbitmq-service start
rabbitmqctl status
服务装在CMD里最大的优势是可追溯、可重复执行。哪台机器配置错了,对比一下执行过的命令历史就能定位。
4.2 通过winget一条命令装完常用软件
Windows 10/11自带的winget是命令行软件包管理器。我重装系统后第一件事是开CMD,批量安装基础软件:
bash复制winget install Git.Git
winget install Docker.DockerDesktop
winget install 7zip.7zip
winget install Notepad++.Notepad++
装Docker时要注意,Docker Desktop默认依赖WSL2后端,如果之前没装过WSL2,先执行wsl --install再装Docker。装完后启动Docker Desktop,在终端里跑docker --version验证,如果提示无法从非提升终端启动daemon,多半是WSL内核组件没更新,wsl --update解决。CMD里跑Docker命令时别用管理员窗口,Docker Desktop设计上建议普通用户终端执行客户端命令,用管理员窗口反而容易触发权限判断问题。
4.3 静默安装参数:批量装机的关键
大型软件部署时,图形界面逐个点安装向导是不现实的。标准的静默安装套路是去官网下载installer,然后执行:
bash复制msiexec /i "D:\install\mysql-installer-community-8.0.msi" /qn
很多Exe安装包也支持静默参数,比如Git的静默安装是Git-2.47.0-64-bit.exe /VERYSILENT /NORESTART,7-Zip是7zsetup.exe /S。不同软件厂商的参数不统一,但基本都支持/S或者/quiet。做“cmd静默运行”的批量部署脚本前,先用/?查看安装器帮助,或去软件文档里查静默安装章节,避免凭运气试参数。
4.4 模型推理类软件的命令行操作
像Ollama这种本地模型运行工具,安装包本身就是命令行优先。Windows下安装完,CMD里执行ollama serve启动服务,默认把模型放在C:\Users\<用户名>\.ollama\models。如果想改模型存放位置,先设置环境变量:
bash复制setx OLLAMA_MODELS "D:\modelstorage\ollama"
然后用新的模型目录重启服务。用GPU部署模型的时候,GPUStack这类平台也提供命令行安装方式,安装完进命令行执行启动服务,整个流程和传统软件部署没本质区别。核心思路是:任何服务型软件,优先找它的命令行启动方式和日志目录,比图形界面更可控。
4.5 在线升级和容器化应用
Dify这类应用如果用Docker部署,升级其实也是几条命令的事:
bash复制docker compose pull
docker compose up -d
pull拉取新镜像,up -d按新配置重建容器。在CMD里跑这些命令时要注意,PowerShell和CMD对环境变量的引用语法不同,CMD用%VAR%,PowerShell用$env:VAR。混用两种终端时最容易翻车的就是这个。我一般固定用CMD跑所有部署类命令,避免上下文切换带来的低低级错误。
5. 把散装命令组合成批处理,日常操作就能一键封装
单个命令解决单点问题,但真正让CMD效率起飞的是组合。写批处理(.bat或.cmd)不复杂,本质就是把平时手动敲的一条条命令按顺序写进文本文件。
5.1 一个最简单的巡检脚本
下面这个脚本是我常用的磁盘和网络巡检批处理,输出直接写入日志文件:
batch复制@echo off
set LOG=D:\ops\check_%date:~0,4%%date:~5,2%%date:~8,2%.log
echo ===== 巡检开始 %date% %time% ===== >> "%LOG%"
echo [网络] 默认网关连通性 >> "%LOG%"
ping -n 2 192.168.1.1 >> "%LOG%"
echo [磁盘使用率] >> "%LOG%"
wmic logicaldisk get caption,freespace,size /format:csv >> "%LOG%"
echo [关键端口] 8080监听状态 >> "%LOG%"
netstat -ano | findstr :8080 >> "%LOG%"
echo ===== 巡检结束 ===== >> "%LOG%"
%date:~0,4%这类写法是提取系统日期字符串的片段,注意不同语言区域的日期格式不一样,如果在中文系统上跑英文Windows,日期字段位置可能不同,最好先用echo %date%看一眼实际输出格式再写截取。我把这个脚本注册成计划任务,每天早上打卡自动跑:
bash复制schtasks /create /tn "DailyOpsCheck" /tr "D:\ops\check.bat" /sc daily /st 09:00 /f
之后想手动跑一次,执行schtasks /run /tn "DailyOpsCheck"。日志文件越积越大,用forfiles按天数清理:
bash复制forfiles /p D:\ops /m *.log /d -14 /c "cmd /c del @path"
这行命令会删除14天以前的日志文件,注意/d -14是按最后修改日期算的,不是创建日期。
5.2 检查错误码:批处理不闪退和权限判断
新手写批处理最常见的遭遇是“双击闪退”,程序跑完,CMD窗口直接关闭,根本看不清输出。最简单的解决办法是每段脚本末尾加一行pause,或者先用echo输出结果再pause等按键。如果想让脚本在普通双击下自动申请管理员权限,可以用这段经典逻辑:
batch复制@echo off
net session >nul 2>&1
if %errorlevel% neq 0 (
powershell -Command "Start-Process '%~f0' -Verb runas"
exit /b
)
echo 当前已经是管理员权限
net session >nul 2>&1是探测管理员权限的常见技巧,非管理员下会返回非零值,然后脚本通过PowerShell把自己提权重跑。注意这条命令会被某些安全软件标记为权限探测行为,如果是自己写的运维脚本问题不大,别在别人的机器上乱用。
5.3 for循环:批量处理的核心武器
for在批处理里是被低估的力量。比如要批量把当前目录下的.txt文件改成.md后缀:
batch复制@echo off
for %%i in (*.txt) do ren "%%i" "%%~ni.md"
%%~ni表示取文件名去掉扩展名的部分,在CMD窗口里手动敲时用单百分号%i,在批处理文件里必须写双百分号%%i,这是新手最容易卡住的地方。再比如批量连接多个IP看通不通:
batch复制@echo off
for %%i in (192.168.1.1 192.168.1.2 192.168.1.3) do (
ping -n 1 %%i >nul && echo %%i 通 || echo %%i 不通
)
这种“一行循环搞定一批机器”的思路,应用到文件重命名、日志清理、批量复制目录都非常顺手。理解了for的基本结构,批处理的自由度会明显上一个台阶。
5.4 几个容易被忽略的小技巧
一行多命令:用&&串联“成功才继续”,比如编译完再启动服务;用||做失败兜底。输出到剪贴板:一些命令输出很长,比如systeminfo,加| clip可以直接复制到剪贴板,再粘贴到聊天工具里发给别人排查,比截图干净。doskey宏定义:给频繁使用的一长串命令起别名,比如:
bash复制doskey npp=cd /d D:\tools\Notepad++ && start notepad++.exe $*
$*会展开成宏名后面跟的所有参数。不过doskey宏只对当前CMD会话生效,想永久生效得把它写进注册表的AutoRun,或者放到一个每次打开CMD都加载的批处理里,这个不是必备但值得知道。
批处理看着是“老东西”,但用来做定时巡检、批量部署、日志清理、端口探测,到现在依然是Windows运维里性价比最高的方案。我自己电脑上放着一个tools目录,里面十几个.bat文件,装系统、配环境、修网络,全是靠这些脚本在撑。命令行这东西,用习惯了就回不去了——至少在我不得不靠它救场的那几次,它是真没掉过链子。
