导读:很多 Windows 使用者分不清 CMD(命令提示符)和 PowerShell,以为只是界面不一样。实际上二者底层架构、数据模型、脚本能力存在代差。本文从历史起源、核心原理、管道机制、实战命令、脚本差异、安全策略、适用场景全方位对比,尤其适合运维、自动化测试、开发人员参考。

前置概念澄清(避坑)
先理清一组极易混淆名词:
-
cmd.exe(CMD / 命令提示符):传统命令解释器(Shell)
-
PowerShell:新一代面向对象 Shell,分两个版本
-
Windows PowerShell 5.1:系统预装,
powershell.exe,基于.NET Framework,仅 Windows,不再新增功能 -
PowerShell 7.x(PowerShell Core):开源跨平台,
pwsh.exe,支持 Windows/Linux/macOS
-
-
Windows Terminal(WT) :终端模拟器(容器),不是 Shell !
WT 只是图形界面,可以同时内嵌 CMD、PowerShell、WSL,不能把 WT 和命令解释器混为一谈。
一、基础信息总览
| 对比项 | CMD(cmd.exe) | PowerShell(pwsh/powershell.exe) |
|---|---|---|
| 诞生背景 | 继承 MS-DOS,Windows NT 时代 (1993) | 2006 年微软推出,目标替换传统命令行 |
| 底层架构 | DOS 兼容文本解释器 | 基于.NET/.NET Core,面向对象架构 |
| 核心设计 | 执行文本命令,兼容老旧程序 | 系统管理、自动化脚本平台 |
| 默认脚本后缀 | .bat / .cmd批处理 |
.ps1 PowerShell 脚本 |
| 命令范式 | 零散缩写命令(dir、tasklist、sc) | 动词 - 名词规范 CmdLet:Get/Set/New/Remove-xxx |
| 管道传输内容 | 纯文本字符串 | 完整.NET 对象(最大本质区别) |
| 跨平台性 | 仅 Windows 可用 | PowerShell7 支持 Windows/Linux/macOS |
| 安全机制 | 无原生脚本执行限制 | 拥有执行策略 ExecutionPolicy安全管控 |
| 远程管理能力 | 薄弱,依赖第三方工具 | 原生支持 WinRM 远程会话 Enter-PSSession |
二、最核心差异:管道与数据处理方式
1)CMD:管道传递纯文本
CMD 所有输出都是格式化字符串。
执行 tasklist 得到一张文本表格;当使用管道 |,只是把一段文本传给下一条指令。
筛选进程必须依靠 findstr 文本匹配,无法直接读取进程 PID、内存、CPU 等结构化信息。
示例:查找 chrome 进程
cmd
tasklist | findstr chrome
缺点:
-
输出格式一旦微调,脚本直接失效
-
无法原生做排序、数值大小比较、字段提取
-
需要大量
for /f字符串切割,代码晦涩难维护
2)PowerShell:管道传递对象(降维优势)
PowerShell 执行Get-Process,返回Process 对象集合 。对象自带属性:Name、Id、CPU、WorkingSet、StartTime、Path 等。
管道传递的不是文字,而是带属性的结构化对象。
示例:筛选 CPU 占用最高的前 10 个进程
powershell
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name,Id,CPU
可以直接:
-
按数值排序
-
条件过滤
Where-Object {$_.CPU -gt 100} -
直接调用对象方法:
Get-Process notepad | Stop-Process一键关闭记事本
通俗类比:
CMD:只能拿到一张打印出来的纸质表格,需要肉眼 / 文本工具抠文字;
PowerShell:直接拿到表格数据库,任意读取、筛选、修改字段。
补充:$_ 代表管道中当前对象 ,是 PowerShell 脚本最常用语法。
使用 Get-Member 可以查看任意对象拥有哪些属性与方法:
powershell
Get-Process | Get-Member
三、常用命令横向对比(运维 / 测试高频)
PowerShell 为兼容老用户,提供大量别名:
dir、ls、cls、cd均可正常使用,但底层原生 CmdLet 是标准写法。
| 功能 | CMD 写法 | PowerShell 原生写法(别名附后) |
|---|---|---|
| 列出目录 | dir |
Get-ChildItem(别名 dir/ls) |
| 切换目录 | cd |
Set-Location(别名 cd) |
| 查看进程 | tasklist |
Get-Process |
| 结束进程 | taskkill /F /PID xxx |
Stop-Process -Id xxx |
| 查看服务 | sc query |
Get-Service |
| 启停服务 | net start sshd |
Start-Service sshd / Stop-Service sshd |
| 查看 IP 地址 | ipconfig |
Get-NetIPAddress |
| 查看 TCP 连接 | netstat -ano |
Get-NetTCPConnection |
| 文件复制 | copy |
Copy-Item |
| 创建文件夹 | md test |
New-Item -ItemType Directory test |
⚠️ 重要兼容边界:
-
PowerShell 可以直接执行 CMD 传统命令(ping、ipconfig、docker、ssh 等 exe 程序通用)
-
CMD 无法识别任何 PowerShell CmdLet ,在 cmd 里直接输入
Get-Process会提示不是内部命令
四、脚本能力对比:bat vs ps1
CMD 批处理 (.bat/.cmd)
优点:兼容性极强,老旧工控、BIOS 工具、传统 Windows 软件普遍配套 bat 脚本;双击直接运行。
局限:
-
语法残缺,复杂循环、条件判断、字符串处理极其麻烦
-
没有原生数组、面向对象、日期计算
-
很难做结构化数据导出(JSON/CSV)
示例 bat:遍历当前目录 txt 文件
batch
@echo off
for %%i in (*.txt) do (
echo 文件名称:%%i
)
PowerShell 脚本 (.ps1)
完整编程语言特性:循环、分支、数组、正则、异常捕获、调用.NET 类、导出 CSV/JSON、REST 接口请求(适合 Redfish/BMC 自动化测试)。
示例 ps1:遍历 txt 并打印文件名
powershell
Get-ChildItem *.txt | ForEach-Object {
Write-Host "文件名称:$($_.Name)"
}
【新手高频踩坑:PowerShell 执行策略】
Windows 客户端系统默认策略 Restricted,禁止直接运行本地 ps1 脚本 。
管理员权限执行放行(日常自动化推荐):
powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
策略含义:本地自行编写脚本允许运行;网络下载脚本需要数字签名。
注意:执行策略属于安全防护策略,不是 ACL 权限。
五、网络、远程运维与自动化拓展
- SSH 支持
PowerShell 原生集成 ssh 客户端,可以直接连接 Linux 服务器、BMC 管理口:
powershell
ssh root@192.168.1.100
scp file.tar root@server:/tmp
CMD 也能调用 ssh,但缺少配套管道与对象处理,自动化链路不连贯。
-
Windows 远程管理 WinRM
PowerShell 独有
Enter-PSSession,跨机器交互式远程管理 Windows 服务器,大批量运维必备。 -
模块化扩展
PowerShell 支持
Install-Module在线安装功能模块,例如服务器硬件监控、Windows 更新、云平台 SDK;CMD 无原生模块扩展机制。
六、Linux 使用者快速对照
如果你熟悉 Linux Bash,可以快速建立映射关系:
| Linux Bash | Windows PowerShell | CMD 等效方案(不推荐复杂场景) |
|---|---|---|
| bash/sh | PowerShell(pwsh) | CMD |
| .sh 脚本 | .ps1 脚本 | .bat |
| grep | Select-String | findstr |
| awk | ForEach-Object / 选择对象 | for /f 文本切割 |
| sed | 字符串方法、Replace () | 第三方工具或者笨拙批处理 |
| systemctl | Get-Service / Start-Service | sc /net 命令 |
七、实战选型建议
✅ 优先选择 PowerShell 的场景
-
Windows 服务器自动化运维、批量巡检
-
BMC、Redfish、硬件自动化测试、日志解析
-
需要复杂条件判断、排序、数据统计、导出报表
-
Windows + Linux 混合环境,频繁使用 SSH、SCP
-
和 Python 联动:PowerShell 负责环境调用、SSH、文件操作;Python 负责数据分析、报告生成
✅ 继续使用 CMD /bat 的场景
-
运行老旧厂商工具、传统 BIOS 固件配套批处理
-
极少数遗留软件仅能在 cmd 环境正常执行
-
极简一次性命令(ping、简单文件复制)
长期技术路线建议:
日常终端直接使用 Windows Terminal + PowerShell 7(pwsh),兼顾现代特性、跨平台、强大自动化能力;仅维护历史 bat 脚本时打开 CMD。
八、常见误区澄清
-
❌ 误区:Windows Terminal = PowerShell
✅ 正解:WT 是终端界面容器,可以装载 CMD、PowerShell、WSL;三者相互独立。
-
❌ 误区:PowerShell 完全淘汰 CMD
✅ 正解:微软没有计划移除 cmd.exe,大量存量工业软件、老旧业务依赖批处理,短期内无法替代。二者属于互补而非单纯取代。
-
❌ 误区:
powershell.exe和pwsh.exe一样✅ 正解:powershell.exe=5.1(Windows 内置,仅限 Windows);pwsh=PowerShell7 跨平台新版,功能更强。
九、总结
CMD 是兼容历史、面向文本的传统命令行工具 ,定位是执行简单指令、运行遗留批处理;
PowerShell 是面向对象、为现代系统自动化而生的完整脚本平台,管道传递对象、标准化 CmdLet、原生远程管理、可扩展模块体系是核心优势。