最新消息: 预先成其事必先利其器

PowerShell vs Cmd(命令提示符)全面对比

12 浏览 PowerShell Cmd

一、本质区别(最核心)

维度 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 中 dircopydeltype 等仍可用(作为别名),兼容 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 环境(资源受限)
  • 一行快速命令(如 ipconfigping

应该用 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

学习路径

  1. 第一周​:把日常 Cmd 命令换成 PowerShell 等价物
  2. 第二周​:掌握管道 + Where-Object + Select-Object + ForEach-Object
  3. 第三周​:写 .ps1 脚本替代 .bat
  4. 之后​:模块开发、DSC、云自动化

总结

Cmd PowerShell
定位 遗留命令行工具 现代自动化平台
核心 文本 对象
上限 极高(.NET 全生态)
学习曲线 中(但回报大)
微软态度 维护模式 战略核心

结论​:2026 年了,除非维护遗留 .bat,否则所有新脚本和自动化任务都应该用 PowerShell。它不是"更好的 Cmd",而是一个完全不同的、更强大的平台。