一、本质区别(最核心)
| 维度 |
Cmd (cmd.exe) |
PowerShell |
| 诞生年份 |
1987(随 DOS) |
2006(v1.0)/ 2018(Core) |
| 本质 |
命令解释器(Command Interpreter) |
面向对象的自动化框架 + Shell |
| 数据传递 |
纯文本 |
.NET 对象 |
| 底层 |
Win32 API 调用 |
.NET Runtime(CLR) |
| 跨平台 |
❌ 仅 Windows |
✅ Windows / Linux / macOS |
💡 一句话总结:Cmd 是"文本处理器",PowerShell 是"对象操作引擎"。
二、管道机制对比(最直观的差异)
Cmd:文本管道
:: 输出是纯文本字符串,后续命令只能做文本匹配
dir | findstr ".txt"
- 管道传递的是 字符流(string)
- 每个命令需要自己解析文本格式
- 列对齐、空格、编码都可能导致解析失败
PowerShell:对象管道
# 输出是 FileInfo 对象,后续命令直接操作属性
Get-ChildItem | Where-Object { $_.Length -gt 1MB } | Sort-Object LastWriteTime
- 管道传递的是 .NET 对象
- 下游命令直接访问
.Name、.Length、.LastWriteTime 等属性
- 无需正则解析,结构化数据天然可靠
实际对比示例
需求:找出 C:\Temp 下大于 100MB 的文件,按修改时间排序
:: Cmd:痛苦
dir C:\Temp /s /o-d | findstr /r "^[0-9]"
:: 还得手动看大小列,无法直接过滤 >100MB
# PowerShell:一行搞定
Get-ChildItem C:\Temp -Recurse -File |
Where-Object Length -gt 100MB |
Sort-Object LastWriteTime -Descending |
Format-Table Name, @{N='SizeMB';E={[math]::Round($_.Length/1MB,2)}}, LastWriteTime
三、命令体系对比
| 特性 |
Cmd |
PowerShell |
| 命令命名 |
无统一规范(dir,copy,del) |
动词-名词规范(Get-ChildItem,Copy-Item,Remove-Item) |
| 内置命令数 |
~40 个 |
数千个 cmdlet + 可加载模块 |
| 帮助系统 |
help或/?(简陋) |
Get-Help(含示例、在线文档) |
| 别名 |
doskey(有限) |
Set-Alias(完整别名系统) |
| 发现命令 |
靠记忆/搜索 |
Get-Command -Verb Get -Noun *Service* |
常用命令对照表
| 功能 |
Cmd |
PowerShell |
| 列目录 |
dir |
Get-ChildItem/ls/dir |
| 复制 |
copy/xcopy/robocopy |
Copy-Item |
| 删除 |
del/rmdir |
Remove-Item |
| 移动 |
move |
Move-Item |
| 查看内容 |
type |
Get-Content/cat |
| 搜索文本 |
find/findstr |
Select-String/sls |
| 环境变量 |
set/echo %PATH% |
Get-ChildItem Env:/$env:PATH |
| 进程管理 |
tasklist/taskkill |
Get-Process/Stop-Process |
| 服务管理 |
sc/net start |
Get-Service/Start-Service |
| 网络诊断 |
ping/ipconfig |
Test-Connection/Get-NetIPConfiguration |
| 注册表 |
reg |
Get-ItemProperty HKLM:\... |
⚡ PowerShell 中 dir、copy、del、type 等仍可用(作为别名),兼容 Cmd 习惯。
四、脚本能力对比
| 能力 |
Cmd (.bat/.cmd) |
PowerShell (.ps1) |
| 变量 |
%VAR%(字符串) |
$var(任意 .NET 类型) |
| 数据类型 |
仅字符串 |
int, string, array, hashtable, object, DateTime... |
| 条件语句 |
if(仅字符串/数字比较) |
if/elseif/else,switch(支持正则、通配符) |
| 循环 |
for,for /f,while(语法晦涩) |
for,foreach,while,do-while,ForEach-Object |
| 函数 |
:label+call(原始) |
function(支持参数验证、管道输入) |
| 错误处理 |
errorlevel(数字) |
try/catch/finally+$Error对象 |
| 模块/复用 |
无 |
Import-Module、类(class)、枚举 |
| 远程执行 |
需借助 PsExec/WinRM 手动配置 |
Invoke-Command(原生 PSRemoting) |
| 并行 |
❌ |
ForEach-Object -Parallel(v7+) |
脚本示例对比
需求:遍历 1~5,输出平方值
:: Cmd batch
@echo off
for /L %%i in (1,1,5) do (
set /a sq=%%i*%%i
call echo %%i squared is %%sq%%
)
# PowerShell
1..5 | ForEach-Object {
[PSCustomObject]@{
Number = $_
Squared = $_ * $_
}
}
# 输出:
# Number Squared
# ------ -------
# 1 1
# 2 4
# 3 9
# 4 16
# 5 25
五、系统管理能力
| 管理领域 |
Cmd |
PowerShell |
| WMI/CIM |
wmic(已弃用) |
Get-CimInstance(原生) |
| Active Directory |
需 dsquery/dsmod |
Get-ADUser(RSAT 模块) |
| Exchange / M365 |
❌ |
官方模块 |
| Azure / AWS |
❌ |
Az/AWS.Tools模块 |
| Hyper-V |
❌ |
Get-VM,Start-VM |
| IIS |
appcmd(有限) |
IISAdministration模块 |
| 组策略 |
gpresult(只读) |
Get-GPO(完整管理) |
| 事件日志 |
wevtutil(文本) |
Get-WinEvent(对象) |
🏢 企业环境中,PowerShell 几乎是 Windows 管理的唯一现代化方案。
六、性能与资源
| 指标 |
Cmd |
PowerShell |
| 启动速度 |
~10ms |
~200-500ms(需加载 .NET) |
| 内存占用 |
~2-5 MB |
~30-80 MB |
| 简单命令执行 |
略快 |
略慢(对象开销) |
| 复杂数据处理 |
极慢(文本解析) |
快得多(原生对象操作) |
对于日常简单操作差异可忽略;批量/复杂任务 PowerShell 反而更快。
七、跨平台与未来
|
Cmd |
PowerShell |
| Windows |
✅ 内置 |
✅ 内置(5.1)/ 可装 7.x |
| Linux |
❌ |
✅pwsh |
| macOS |
❌ |
✅pwsh |
| 微软投入 |
⛔ 已停止开发(仅维护) |
✅ 活跃开发(GitHub 开源) |
| 未来趋势 |
逐步边缘化 |
微软自动化/DevOps 核心 |
八、什么时候用哪个?
仍然用 Cmd 的场景
- 极简单的批处理(
.bat 双击运行)
- 遗留系统/老脚本兼容
- 嵌入式/PE 环境(资源受限)
- 一行快速命令(如
ipconfig、ping)
应该用 PowerShell 的场景
- ✅ 任何需要结构化数据处理的任务
- ✅ 自动化运维(服务器管理、AD、云)
- ✅ 需要错误处理、日志、模块化的脚本
- ✅ 跨平台脚本
- ✅ 调用 .NET / COM / REST API
- ✅ CI/CD 流水线(GitHub Actions、Azure DevOps)
- ✅ 安全审计、合规检查
九、迁移建议
# 在 PowerShell 中仍可运行 Cmd 命令
cmd /c "dir C:\ /s"
# 但建议逐步迁移:
# dir → Get-ChildItem
# findstr → Select-String
# tasklist → Get-Process
# netstat → Get-NetTCPConnection
# sc query → Get-Service
学习路径
- 第一周:把日常 Cmd 命令换成 PowerShell 等价物
- 第二周:掌握管道 +
Where-Object + Select-Object + ForEach-Object
- 第三周:写
.ps1 脚本替代 .bat
- 之后:模块开发、DSC、云自动化
总结
|
Cmd |
PowerShell |
| 定位 |
遗留命令行工具 |
现代自动化平台 |
| 核心 |
文本 |
对象 |
| 上限 |
低 |
极高(.NET 全生态) |
| 学习曲线 |
低 |
中(但回报大) |
| 微软态度 |
维护模式 |
战略核心 |
结论:2026 年了,除非维护遗留 .bat,否则所有新脚本和自动化任务都应该用 PowerShell。它不是"更好的 Cmd",而是一个完全不同的、更强大的平台。