PowerShell 功能强大,但不是所有事都适合用它。有些场景下,CMD 的经典命令反而更快、更短、更好记。
这篇文章列出 5 个「直接用 CMD 更省事」的真实场景,全部在 Windows 11 上实测过,附 PowerShell 等价写法做对比。先说清楚一个前提:netstat、tree、shutdown、robocopy 这些都是 C:\Windows\System32 下的独立程序,在 PowerShell 窗口里也能直接敲——所谓「用 CMD」,指的是用这些命令的经典写法,而不是非要打开 cmd.exe 窗口。
先看一个数据:CMD 启动就是比 PowerShell 快
在本机(i9-13900H)实测,各启动 5 次取平均:
| 解释器 | 平均启动耗时 |
|---|---|
cmd.exe |
约 386 ms |
powershell.exe -NoProfile |
约 660 ms |
差了将近一倍。日常随手敲个命令,这个差距体感明显——CMD 窗口几乎是秒开。
场景 1:批量改文件后缀,ren 一条搞定
把目录下所有 .txt 改成 .md,CMD 里只要一行:
ren *.txt *.md
实测效果:
--- 改名前 ---
a.txt b.txt c.txt
--- 改名后 ---
a.md b.md c.md
PowerShell 里的 ren 是 Rename-Item 的别名,语法完全不同,-NewName 不吃通配符映射,必须写脚本块:
Get-ChildItem *.txt | Rename-Item -NewName { $_.BaseName + '.md' }
同样是批量改后缀,CMD 一行,PowerShell 一行半还得回想 {} 和 $_.BaseName 的写法。
场景 2:查杀端口占用
服务起不来,报「端口被占用」,最快的排查路径:
netstat -ano | findstr :8080
输出一行就带 PID(实测本机 135 端口的输出格式):
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1424
拿到 PID 直接杀:
taskkill /f /pid 1424
PowerShell 等价写法是 Get-NetTCPConnection,命令长、默认输出还是对象表格,PID 在 OwningProcess 列里:
Get-NetTCPConnection -LocalPort 8080 | Select-Object OwningProcess
Stop-Process -Id 1424 -Force
netstat -ano | findstr 这条组合很多老运维闭着眼睛都能敲出来——因为它确实短。
场景 3:看目录结构,tree /f 没有对手
想快速看清一个目录的层级:
tree /f
/f 参数把文件也列出来,实测输出(在 cmd 窗口中):
C:\TEMP\CMDTEST-TREE
│ root.txt
│
├───sub1
│ │ note.md
│ │
│ └───deep
│ a.log
│
└───sub2
PowerShell 没有内置等价命令。要么照样调 tree.com(那为什么不直接记住这个命令),要么手写递归函数,十几行起步。
一个实测发现的坑:在 PowerShell 里跑 tree /f,中文 Windows 上树线可能显示成乱码——tree 按 GBK 编码输出,而 PowerShell 控制台默认按 UTF-8 解码。在 cmd 窗口里显示完全正常。这算不算「CMD 更快」的另一个理由,见仁见智。
场景 4:定时关机,关键是能取消
下班后让电脑 1 小时后自动关机:
shutdown /s /t 3600
反悔了随时取消:
shutdown /a
实测:/a 取消成功,退出码 0。/t 单位是秒,3600 就是一小时。
PowerShell 的 Stop-Computer 是立即执行,没有倒计时参数,也没有对应的「取消」命令。想定时关机,你得自己去拼 Start-Sleep 加 Stop-Computer,还取消不了——进程睡了不等于能叫醒。
类似的还有 shutdown /r /t 0(立即重启)、shutdown /l(注销),都是一行的事。
场景 5:目录同步备份,robocopy 才是本体
把源目录镜像同步到备份目录(新增复制、多余删除):
robocopy C:\src D:\backup /MIR
实测:源目录新增的文件被复制过去,备份目录里多出来的旧文件被删除,两边最终完全一致。
一个必须知道的坑:robocopy 的退出码 0~7 全是成功,8 及以上才是失败。实测这次同步退出码是 3(= 复制了文件 1 + 删除了多余文件 2)。写批处理脚本时要这样判断:
robocopy C:\src D:\backup /MIR
if %ERRORLEVEL% GEQ 8 (echo FAILED) else (echo OK)
用惯 Linux 的人会本能地写 if %ERRORLEVEL% NEQ 0——那每次都报失败。PowerShell 的 Copy-Item 没有增量和镜像语义,Compare-Object 自己拼增量同步纯属折磨。
什么时候还是该用 PowerShell
别把这篇文章读成「CMD 万岁」。这些场景 PowerShell 依然是唯一选择:
- 处理结构化数据:
ConvertFrom-Json、Import-Csv、对象管道 - 远程管理:
Enter-PSSession、Invoke-Command - 批量处理要带条件逻辑、异常捕获的脚本
原则很简单:敲一下就走的用 CMD 命令,要写逻辑的上 PowerShell。
文中提到的命令在 Windows CMD 命令速查 里都有完整参数表,PowerShell 速查 可以对照着看。