[Windows/命令行/Powershell] PowerShell:微软跨平台对象化命令行 Shell 与自动化的开源框架、 CMD/VBScript的终结者

0 序

  • 不少 AI Agent (Codex、deepseek-hardness、claude 等)或 VSCode 等软件在 Windows 端都越加倾向于让用户使用 powershell 作为 CLI 命令运行环境。因此,未来大概率将长期使用 powershell 了。

1 概述: PowerShell

  • PowerShell(尤其是跨平台的 PowerShell Core)不仅是一个系统终端,更是一个强大的自动化脚本工具和对象管道处理器。在处理数据集、管理实验环境、调试本地 API 服务时,它比传统的 Cmd 更加高效。

产品介绍

  • 产品定位:PowerShell 是微软主导的跨平台任务自动化解决方案,同时是命令行 Shell、脚本语言与配置管理框架。它以.NET 对象管道为核心设计——命令间传递的是结构化对象而非纯文本,从根本上区别于传统文本型 Shell。

  • 诞生的背景与原因

    • 2002 年微软架构师 Jeffrey Snover 发表著名的《Monad Manifesto》,指出 Windows 管理的痛点是"Shell 建立在文本之上"Unix 工具靠文本流组合,而 Windows 的配置散落在注册表、WMI、COM 等结构化存储中,文本管道难以匹配。其构想(代号 Monad)是一个"管道里走对象"的 Shell。Monad 于 2003 年 PDC 大会首次公开、2005 年公测,2006 年 4 月更名为 Windows PowerShell2006 年 11 月 14 日发布 1.0(约 130 个 Cmdlet)。
    • 解决的核心问题
      • 统一并取代 CMD 与 VBScript,为系统管理员与开发者提供"可发现、一致、面向对象"的命令行与脚本体系;
      • 2016 年开源后进一步解决跨平台(Windows/Linux/macOS)自动化统一问题。
  • URLs

发展历程

阶段 版本 发布日期 关键特性 运行时
Windows PowerShell(仅 Windows) 1.0 2006-11-14 首个版本,约 130 个 Cmdlet,对象管道、Verb-Noun 命名 .NET Framework
2.0 2009-07 远程管理(Remoting)、模块化、后台作业、ISE 集成脚本环境 .NET Framework
3.0 2012-10 工作流(Workflow)、计划作业、语言与 ISE 大幅增强 .NET Framework
4.0 2013-10 引入 DSC(Desired State Configuration) 声明式配置管理 .NET Framework
5.0/5.1 2016 类(Class)、包管理;5.1 为该系列最终版,Windows 仍内置 .NET Framework
开源转折点 2016-08-18 PowerShell 以 MIT 许可开源并转向跨平台(.NET Core)
PowerShell Core(跨平台) 6.0 2018-01-10 基于 .NET Core 重写,支持 Windows/macOS/Linux,可执行文件 pwsh .NET Core
PowerShell(去"Core"标签) 7.0 2020-03-04 移除"Core"字样,标志 pwsh 跨平台版成为主版本 .NET Core 3.1
7.2 2021-11 LTS 版 .NET 6
7.3 2022-11-09 补充增强 .NET 7
7.4 2023-11-16 LTS 版(支持至 2026-11-10) .NET 8
7.5 2025-01-23 常规版(支持至 2026-11-10) .NET 9
7.6 2026-03-18 当前最新 LTS 版(支持至 2028-11-14);GitHub 最新发布为 v7.6.4(2026-07-20) .NET 10

说明:自 7.x 起形成"常规版与 LTS 版交替"的发布节奏,LTS 提供更长支持窗口(约 2.5 年)。

区分 PowerShellWindows Powershell :自 PS 6.0起

  • PowerShell 在 6.0 版之前只存在于Windows,基于.NET Framework构建,两词无区别。
  • 从 6.0 开始基于.NET Core 重新构建了PowerShell,开始可以跨平台(Windows、macOS 和 Linux),而 Windows Powershell 仍专属于Windows,两词区别开来,分别指两个不同的东西。

截至目前 Windows Powershell最新为5.1版,PowerShell已到7.2版。两者日常使用基本相同,但也有一定区别,按下不表,可看官方文档。
在Windows上两者可共存,独立使用。

  • 官方文档

主要功能

  • 对象化管道(Object Pipeline):核心特性。Get-Process | Where-Object { $_.WS -gt 100MB } | Sort-Object WS -Descending 等命令直接对对象属性过滤、排序,无需文本解析。
  • Cmdlet 命令体系:统一"动词-名词"命名(Get-Item/Set-Location/Stop-Service),配 Get-CommandGet-HelpGet-Member 实现高度可发现性;共用 -WhatIf-Confirm-ErrorAction 等通用参数。
  • 脚本语言能力:完整编程语言,支持函数、类、模块、异常处理、动态类型,构建于 .NET CLR 之上,可直接调用 .NET API。
  • 远程管理(Remoting):基于 WinRM 或 SSH 的远程会话,单会话管理多台机器。
  • 配置管理(DSC):"配置即代码",声明式描述并强制系统配置,支持推送/拉取模式。
  • Provider 模型:以统一命令访问文件系统、注册表、证书存储、环境变量等不同"数据存储"。
  • 生态系统:PowerShell Gallery 集中分发模块;官方模块覆盖 Azure(Az)、Windows、Exchange、SQL;第三方覆盖 AWS、VMware、Oracle 云等。
  • 内置数据格式支持:CSV、JSON、XML、YAML 等结构化数据的解析与序列化
  • 交互体验:PSReadLine 提供命令历史、Tab 补全、命令预测(语法着色、行内预测)。
  • 并行与现代化语法ForEach-Object -Parallel(7.0+)、三元运算符、空合并运算符等。

核心优势

  1. 对象而非文本:管道传递结构化对象,数据处理精确、无需脆弱的字符串解析,可编程性强。
  2. 统一 Windows 管理:注册表、服务、进程、事件日志、WMI/CIM、AD、Exchange、Azure 等全部可用同一套命令/模块管理。
  3. 跨平台pwsh 在 Windows/Linux/macOS 上运行同一套语言,是 DevOps 跨平台脚本的可靠选择。
  4. 成熟生态与社区:官方模块 + PowerShell Gallery 第三方模块丰富,微软官方持续维护。
  5. 可发现性与一致性:Verb-Noun 命名、通用参数、内置帮助体系,学习曲线平坦且可迁移。
  6. 开源(MIT):代码透明,社区可贡献,微软与社区双轨驱动。

主要短板

  1. 性能:.NET 启动与对象构造带来明显开销,启动速度、大对象流吞吐不及原生文本 Shell(CMD/Bash)。
  2. 与 Unix 生态的隔阂:命令命名(Get-ChildItem vs ls)、语法(- 前缀参数 vs --)、布尔大小写敏感等与 Bash 习惯差异大,跨生态切换有认知成本。
  3. 脚本可移植性:虽跨平台,但依赖 Windows 特有模块/API 的脚本(注册表、WMI)无法在 Linux/macOS 运行;.NET Framework 与 .NET 的行为差异也可能导致兼容问题。
  4. 内存占用:相比 CMD/Bash 常驻内存更高。
  5. 安全策略(双刃剑):默认 ExecutionPolicy 限制脚本执行,虽增强安全,但对新用户造成"无法运行 .ps1"的常见困扰。

局限性

  • Windows PowerShell 5.1 与 PowerShell 7.x 并存:5.1 内置但停止演进(基于 .NET Framework,仅 Windows),7.x 需单独安装;两者命令结果/行为存在细微差异,混用易踩坑。
  • 语法差异大$ 变量前缀、@() 数组、对象方法调用等语法与主流 Shell 差异明显,对 Bash 用户初期不适。
  • 文本兼容性:对纯文本工具(awk/sed/grep 类)调用体验不及 Bash,需借助 Out-String/ConvertTo-* 等处理。
  • GUI 交互缺位:本身无图形界面,Windows 上需配合 Windows Terminal/VS Code 使用。

适用场景

  • Windows 系统管理/运维:用户、服务、注册表、事件日志、磁盘、AD、Exchange、M365 的批量管理。
  • 云资源自动化:Azure(Az 模块)、AWS、VMware 等的基础设施即代码与部署自动化。
  • DevOps / CI-CD:Azure DevOps、GitHub Actions、GitLab CI 等管道中的构建、测试、部署脚本(跨平台 runner)。
  • 本地开发辅助:Windows 下日常开发(路径、进程、环境变量、文件批处理),替代 CMD。
  • 数据与配置处理:快速解析/生成 JSON、CSV、XML,对接 REST API(Invoke-RestMethod)。
  • 软件交付:Chocolatey 等 Windows 包管理器基于 PowerShell 构建。

同类竞品(必读)

产品 类型 与 PowerShell 的关系
CMD(cmd.exe) Windows 原生文本 Shell 前身/被替代对象,仅 Windows、批处理能力弱,仍是轻量兼容首选
Bash(Git Bash / WSL) Unix 文本 Shell 生态互补;Git Bash 是 Windows 下的 Unix 模拟环境,WSL 提供完整 Linux 环境
Zsh / Fish Unix 现代 Shell Unix 生态侧重交互体验,与 PowerShell 跨平台版在脚本层面竞争
Nushell 数据驱动 Shell 受 PowerShell 对象管道思想影响,面向数据(表格)操作
Python 脚本 通用脚本语言 复杂自动化常与之竞争,但缺原生 Windows 管理 cmdlet
Ansible / Terraform 配置管理/IaC DSC 的同类竞品,声明式管理目标类似但定位更高层

发展趋势

  • 开源社区活跃度:持续高活跃,PowerShell/PowerShell 仓库 约 5.5 万+ Star、8.4K+ Fork、约 546+ 贡献者(2026-04 约为 52.3K Star/8.2K Fork,2026-08 约为 55.1K Star/8.4K Fork,C# 语言仓库排名靠前);Issues 约 1.3K,PR 约 285,提交数 11,478+,发布 211 个 Release。
  • 版本节奏:保持约一年一主版本,LTS 与常规版交替;2026-03 发布 7.6 LTS(.NET 10)。
  • 总结:PowerShell 正从"Windows 管理工具"演进为跨平台云原生自动化基座(云模块 + CI/CD + 容器 + 配置管理),趋势是持续强化跨平台一致性、性能与云生态集成。

2 工作原理与架构

概念术语

术语 说明
Cmdlet PowerShell 内建命令单元,"动词-名词"命名(如 Get-Process),基于 .NET 编译或脚本实现
对象管道 命令间通过管道传递 .NET 对象,而非文本流
Provider 将注册表、文件系统等数据存储抽象为统一命名空间,可用同一套命令访问
Module 打包的命令集(cmdlet/函数/类/配置),可发现、可安装、可版本化
PSReadLine 交互式命令行编辑引擎,提供补全、预测、语法着色
Remoting 基于 WinRM/SSH 的远程命令执行与会话管理
DSC Desired State Configuration,声明式配置管理框架
ExecutionPolicy Windows 上控制脚本是否允许执行的策略(Restricted/RemoteSigned/AllSigned/Unrestricted)
pwsh PowerShell 7.x 跨平台可执行文件名
PowerShell Gallery 官方模块仓库(PSGallery)
Monad Manifesto Jeffrey Snover 2002 年提出的对象 Shell 构想白皮书

架构与运行原理

flowchart LR subgraph 用户层 A[交互式控制台 / pwsh] --> B[脚本 .ps1] C[第三方宿主: VS Code/终端/CI 引擎] --> B end B --> D[语言引擎 / 解析器] D --> E[Cmdlet 命令发现/Get-Command/别名/模块] E --> F[执行引擎/Pipeline 对象流] F --> G[Provider 层/FileSystem/Registry/Env/Cert] F --> H[.NET 对象模型 / CLR] F --> I[远程层/WinRM / SSH] G --> J[数据存储: 文件/注册表/环境变量/证书] H --> K[.NET API / WMI-CIM / COM] I --> L[远端机器]
  • 运行模型:PowerShell 构建于 .NET CLR 之上,解析器将脚本编译为托管代码执行;所有输入输出均为 .NET 对象,Out-Default 负责按格式系统(Format 视图)渲染为终端文本。
  • 管道执行:传统 Shell 串行传递文本;PowerShell 采用流式对象管道——上游命令将对象逐个推给下游(支持流式处理大集合),下游通过 $_.Property 直接读取属性。
  • Provider 机制Get-ChildItem HKLM:\...Get-ChildItem Cert:\... 等通过 Provider 将注册表、证书存储等映射为统一驱动器的路径,实现"同一种命令访问异构存储"。
  • 命令解析优先级:别名(Alias) → 函数(Function) → Cmdlet → 外部应用(Application);这也解释了为何 CMD 命令(dircopy)在 PowerShell 中可用——它们是内建别名的映射。
  • 远程执行:Enter-PSSession/Invoke-Command 通过 WinRM(Windows)或 SSH(跨平台)建立会话,序列化对象跨机器传输,保持对象语义。

3 使用指南

安装部署

Windows

  • Windows PowerShell 5.1:Windows 7/8/10/11、Server 2008 R2+ 默认内置,无需安装。
  • PowerShell 7.x(推荐)
    • MSI 安装包:GitHub Releases 下载 .msihttps://github.com/PowerShell/PowerShell/releases)。
    • wingetwinget install --id Microsoft.PowerShell
    • Chocolateychoco install powershell-core
    • 安装后启用 Windows Terminal / VS Code 中的 "PowerShell"(pwsh)配置文件。

Linux / macOS

  • Linux(以 tar.gz 方式为例)
    wget https://github.com/PowerShell/PowerShell/releases/download/v7.6.4/powershell-7.6.4-linux-x64.tar.gz
    tar -xzf powershell-7.6.4-linux-x64.tar.gz -C /opt/microsoft/powershell/7
    ln -s /opt/microsoft/powershell/7/pwsh /usr/bin/pwsh
    
  • macOSbrew install --cask powershell 或下载 .pkg
  • Dockerdocker pull mcr.microsoft.com/powershell:latest(镜像现由 .NET 团队维护)。

验证

$PSVersionTable   # 查看版本
Get-Command -Module Microsoft.PowerShell.Core | Measure-Object   # 统计命令

关键操作

# 文件与目录
Get-ChildItem -Path C:\data -Recurse -File | Where-Object Length -gt 10MB
Copy-Item / Move-Item / Remove-Item -Recurse

# 进程与服务
Get-Process | Sort-Object WS -Descending | Select-Object -First 5
Get-Service | Where-Object Status -eq 'Running'
Stop-Service -Name Xxx -WhatIf   # 先演练再执行

# 管道与对象
Get-ChildItem | Where-Object { $_.Name -like '*.log' } | Select-Object Name, Length

# 远程
Invoke-Command -ComputerName Srv01 -ScriptBlock { Get-Service }
Enter-PSSession -HostName srv.example.com -UserName admin   # 经 SSH

# 数据处理 / REST API
Get-Content data.json | ConvertFrom-Json | Out-File out.csv
Invoke-RestMethod -Uri https://api.example.com/v1/items -Method Get

# 模块管理
Install-Module -Name Az -Scope CurrentUser -Force
Update-Help -Force

常见坑:执行策略受限时报 "禁止运行脚本" → Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser;脚本含中文注意文件编码(UTF-8 with BOM)以免乱码。

Z FAQ for Powershell

Q: windows 中 .cmd.bat 的区别?

.cmd vs .bat = Windows 系统下的【命令行脚本文件】 vs. Windows 系统下的【批处理脚本文件】

  • .cmd 是 Windows 系统下的命令行脚本文件,它使用 DOS 命令解释器(Command Interpreter)来执行脚本。.cmd 文件通常用于执行简单的命令行任务,如启动应用程序、运行命令行工具等。

.cmd 文件是 Windows NT 系列操作系统引入的扩展名。
随着 Windows NT 和后续的版本(如 Windows 2000、XP、Windows 7 等)的推出,Windows 开始引入对批处理文件的改进和增强。
.cmd 文件就是在这种背景下诞生的,目的是为了解决一些在 .bat 文件中的局限性。

  • .bat (Batch File) 是 Windows 系统下的批处理脚本文件,它使用 Windows 命令解释器(Command Processor)来执行脚本。.bat 文件通常用于执行复杂的命令行任务,如批量处理文件、运行命令行工具等。

.bat 是 Windows 和 DOS 操作系统中批处理文件的传统扩展名。
早期的 MS-DOS 操作系统就使用 .bat 文件来执行一系列命令。
随着 Windows 操作系统的出现,.bat 文件仍然被广泛使用,并且兼容性得到了保持。

.ps1.cmd.bat.exe 的区别

  • .ps1.cmd.bat脚本/文本文件(需要解释器来“翻译”执行),而 .exe 是编译好的二进制可执行文件(操作系统直接运行)。
扩展名 全称/类型 解释器 核心特点 AI 开发场景适用性
.ps1 PowerShell 脚本 powershell.exepwsh 1. 面向对象(管道传递的是对象而非纯文本)。
2. 功能极其强大(可直接调用 .NET 库、REST API、管理云资源)。
3. 跨平台(PowerShell Core)。
⭐⭐⭐⭐⭐ 首选。适合写复杂的训练自动化、日志分析、环境配置脚本。
.bat 批处理文件 (Batch) cmd.exe 1. DOS 时代的产物,最古老。
2. 纯文本行处理,语法简陋,错误处理弱。
3. 仅限 Windows。
⭐⭐ 仅用于维护极旧的遗留系统。
.cmd 命令脚本 cmd.exe 1. 与 .bat 类似,但专为 Windows NT 内核设计。
2. 在某些细节上(如变量扩展、错误返回码)比 .bat 更严谨。
3. 仅限 Windows。
⭐⭐ 基本已被 PowerShell 取代,偶尔用于简单的命令行顺序执行。
.exe 可执行文件 操作系统直接加载 1. 编译后的二进制文件(如 C++/Go/Rust 编译生成)。
2. 运行效率高,不依赖源码。
3. 可以双击直接运行。
⭐⭐⭐⭐ 通常是你训练好的模型打包后的推理服务程序,或者 Python 解释器本身(python.exe)。

总结

  • 写自动化逻辑控制电脑或服务器?用 .ps1
  • 双击运行一个现成程序?用 .exe
  • .bat.cmd 是“上古时代”的脚本,除非维护老项目,否则没必要新写。

推荐文献

Q: 对比 CMD / Powershell / Git Bash ?

定位对比

工具 全称/来源 本质 定位
CMD Command Prompt(Windows 原生 cmd.exe MS-DOS 时代延续的文本命令解释器 轻量、向下兼容,跑旧批处理与基础命令
PowerShell 微软自研(1.0 于 2006 发布,2016 开源) 基于 .NET 的面向对象 Shell + 脚本语言 系统管理、自动化、跨平台脚本
Git Bash Git for Windows 自带(基于 MSYS2/MinGW64) Unix Bash 的 Windows 模拟环境 在 Windows 上跑 Git 与 Linux 常用命令
维度 CMD PowerShell Git Bash
本质 MS-DOS 文本解释器 .NET 面向对象 Shell + 语言 Unix Bash 的 Windows 模拟
数据 文本流 对象流 文本流
命令 dir/copy/del Get-ChildItem/Copy-Item(Cmdlet) ls/cp/rm/grep
脚本 .bat 弱 .ps1 极强(可调 .NET) .sh 强(Unix 工具链)
跨平台 ✅ Win/Linux/macOS ✅(模拟)
典型用途 轻量 / 兼容旧脚本 系统管理 / 自动化 / Azure Git 操作 / Linux 命令

全面对比表

对比维度 CMD PowerShell Git Bash
平台 仅 Windows Windows / Linux / macOS(pwsh) Windows(模拟 Linux 环境)
数据处理 文本流 对象流(.NET 对象) 文本流
管道语义 逐字节/行文本,需 findstr 等解析 对象直传,$_ 取属性 文本流,awk/sed/grep 解析
命令风格 DOS 命令:dir/copy/del/ipconfig CmdletGet-ChildItem/Copy-Item/Remove-Item(兼容多数 CMD 别名) Unix 命令:ls/cp/rm/grep/ssh
脚本能力 批处理 .bat/.cmd,逻辑弱 极强:.ps1,函数/类/异常/并行,可调 .NET API 强:.sh Bash 脚本,Unix 工具链
Git 支持 需安装 Git 并配置 PATH 同上(可通过 posh-git 增强) 原生内置,交互体验最顺
跨平台脚本 是(PowerShell Core) 是(Unix 风格)
Tab 补全/历史 极强(PSReadLine 补全+预测+着色) 强(Bash 风格)
管理能力 基本(注册表需 reg 命令) 原生强(Provider 访问注册表/证书/服务/WMI) 弱(不面向 Windows 管理)
默认集成 Windows 内置 5.1 内置;7.x 需安装 随 Git for Windows 安装
性能/开销 轻量、启动快 较重(.NET 启动与对象开销) 中等
学习成本 低(但能力上限低) 中高(对象模型+新语法) 中(若已懂 Linux)

命令对照示例

操作 CMD PowerShell Git Bash
列目录 dir Get-ChildItem(别名 dir ls -la
复制文件 copy a.txt b.txt Copy-Item a.txt b.txt cp a.txt b.txt
删除文件 del a.txt Remove-Item a.txt rm a.txt
查 IP ipconfig Get-NetIPAddress ip addr / ifconfig
查进程 tasklist Get-Process ps aux
管道示例 `dir findstr "log"` `Get-ChildItem
输出变量 %PATH% $env:PATH | $PATH

区别:windows 中 命令行窗口(C:Windows\System32\cmd.exe) 与 PowerShell

  • PowerShell 是一个开源的脚本语言,它提供了丰富的功能和语法,可以执行更多的命令和脚本。PowerShell 可以在 Windows、Linux 和 macOS 上运行,并且可以与 cmd.exe 一起使用。
  • 在 PowerShell 中,可以使用 cmd 命令来执行 cmd.exe 命令。

常见误区

  • "PowerShell 只是高级版 CMD" → 二者设计哲学完全不同:CMD 是文本命令解释器,PowerShell 是对象管道 + 完整脚本语言。
  • "Git Bash 只是一个 Git 客户端" → 它是完整的 Unix 命令行模拟环境,内含大量 GNU 工具。
  • "CMD 已淘汰" → 轻量、兼容旧脚本,在简单操作与遗留系统上仍有价值。

选型建议

场景 推荐
基础命令、ping/ipconfig、跑旧 .bat CMD
Windows 系统管理、服务/注册表/进程、批量自动化、Azure PowerShell
日常 Git 操作、跑 Linux 命令(grep/awk/ssh) Git Bash
Windows 上写可移植到 Linux 的脚本 PowerShell CoreGit Bash
完整 Linux 开发环境 WSL(补充建议,非三者之一)

Q: 执行脚本报"禁止运行脚本"如何解决?

A: 查看并放宽执行策略:Get-ExecutionPolicy,然后 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser(仅影响当前用户)。仅对明确可信的脚本使用 -ExecutionPolicy Bypass

Q: Windows PowerShell 5.1 和 PowerShell 7.x 该用哪个?

新脚本/跨平台用 7.x(pwsh)

涉及 Windows 特有旧功能(部分旧模块、部分 DSC、ISE)或必须与系统内置环境一致时用 5.1。二者命令行为有细微差异,团队需统一版本。

Q: PowerShell 里能直接跑 Linux 命令吗?

A: 在 Linux/macOS 的 pwsh 中可直接调用本机命令(如 lscurl);Windows 上原生不能,需通过 WSL(wsl ls)或安装对应 Windows 版本。

Q: PowerShell 性能慢怎么办?

A: 启动慢可配合 Windows Terminal 常驻 profile;大量循环用 ForEach-Object -Parallel(7.0+);避免在管道中反复 Format-Table/Out-String;处理超大文本优先用原生工具或流式读取(Get-Content -ReadCount)。

Q: $PSVersionTable 为什么是"2.0"?

A: 这是引擎兼容版本标识,不代表实际功能版本。用 $PSVersionTable.PSVersion 看真实版本,或 $PSVersionTable.GitCommitId 看精确提交。

Q: 中文乱码怎么办?

A: .ps1 文件保存为 UTF-8(带 BOM),或在文件头加 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8;Windows PowerShell 5.1 对 UTF-8 无 BOM 文件默认按 ANSI 读取。

Q: PowerShell 与 Bash 脚本能互相移植吗?

逻辑层可人工改写(语法差异大),但依赖 Windows 特有模块/API(注册表、WMI、AD)的脚本不可移植;建议用 7.x 并避免平台相关 cmdlet 以最大化可移植性。

Y 推荐文献

X 参考文献

posted @ 2026-09-01 11:49  千千寰宇  阅读(8)  评论(0)    收藏  举报