PowerShell

PowerShell（包括Windows PowerShell和PowerShell Core）是微软公司开发的任务自动化和组态管理架构，由在.NET Framework和后来的.NET上构建的命令行界面壳层相关脚本语言组成，最初仅仅是Windows元件，后于2016年8月18日开源并提供跨平台支持。

在PowerShell中，管理任务通常由cmdlets（发音为command-lets）执行，这是执行特定操作的专用.NET类。可以将cmdlet集合至脚本、可执行文件（一般是独立应用程序）中，或通过常规.NET类（或WMI / COM对象）实例化。

## 源起与目的

UNIX系统一直有着功能强大的壳程式（shell），Windows PowerShell的诞生就是要提供功能相当于UNIX系统的命令列壳程式（例如：sh、或csh），同时也内建脚本语言以及辅助脚本程式的工具。

## 程式特性

- 一致性的设计让所有工具和系统资料的使用语法、命名原则都相同。
- 脚本语言简单易学，而且能支援现有的脚本程式和命令列工具。
- 内含129种称为cmdlet的标准工具，可用来处理常见的系统管理工作。
- 具备完整的扩充功能，独立软件商或开发者都能很容易的自行扩充。
- 进程间数据传递内容具有强类型特征。
- PowerShell Core可以自动检测字符编码，自动识别Linux和Windows下的换行符，跨平台运行。

cmdlet是Windows PowerShell的指令，发音念法为command-let。这相当于DOS或其他壳程式的内建指令，指令名称的格式都是以连字号（-）隔开的一对动词和名词，并且通常都是单数名词；例如线上查询说明的cmdlet指令为get-help，名称的动词部分大致有get、set、add、remove等等（字母都不分大小写）。

Windows PowerShell ISE是Windows PowerShell的主机应用程序。在此程序中，可以在单个Windows GUI中运行命令、编辑与测试脚本。此程序具有多行编辑、Tab补齐、上下文相关帮助、语法着色、选择性执行等功能，而且还支持从右到左的书写顺序等功能。

## 技术基础

Windows PowerShell是以.NET Framework技术为基础，并且与现有的保持回溯相容，因此它的脚本程式不仅能存取.NET CLR，也能使用现有的技术。同时也包含了数种系统管理工具、简易且一致的语法，常见如登录数据库、WMI。Exchange Server 2007以及System Center Operations Manager 2007等服务器软件都将内建Windows PowerShell。

## 范例

```powershell
get-process p* | stop-process
```

```powershell
get-process | where { $_.WS -gt 1000MB } | stop-process
```

```powershell
get-childitem | measure-object -property length -sum
```

- 将"hello, world!"字串转为英文大写字元，成为"HELLO, WORLD!"：

```powershell
"hello, world!".ToUpper()
```

```powershell
$rssUrl = "http://blogs.msdn.com/powershell/rss.aspx"
$blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
$blog.rss.channel.item | select title -first 8
```

### 命令提示字元比较

PowerShell（命令行）｜PowerShell（别名）｜命令提示符｜Unix shell｜描述

Get-ChildItem｜gci, dir, ls｜dir｜ls｜列出目前或指定资料夹中的所有档案和资料夹

Test-Connection｜ping｜ping｜ping｜从目前电脑向指定电脑传送Ping，或指示另一台电脑这样做

Get-Content｜gc, type, cat｜cat｜取得档案内容

Get-Command｜gcm｜, , 命令行补全｜列出可用的命令

Get-Help｜help, man｜, man｜在控制台上打印命令的文档

Clear-Host｜cls, clear｜cls｜clear｜清除屏幕

Copy-Item｜cpi, copy, cp｜copy, , robocopy｜cp｜将档案和资料夹复制到另一个位置

Move-Item｜mi, move, mv｜mv｜将档案和资料夹移动到新位置

Remove-Item｜ri, del, erase, rmdir, rd, rm｜, , rmdir, rd｜rm, rmdir｜删除档案或资料夹

Rename-Item｜rni, ren, mv｜, rename｜mv｜重命名单个档案、资料夹、硬连结或符号连结

Get-Location｜gl, cd, pwd｜cd｜pwd｜显示工作路径（目前资料夹）

Pop-Location｜popd｜popd｜popd｜将工作路径更改为最近推送到堆叠上的位置

Push-Location｜pushd｜pushd｜pushd｜将工作路径储存到堆叠中

Set-Location｜sl, cd, chdir｜cd, chdir｜cd｜改变工作路径

Tee-Object｜tee｜不适用｜tee｜将输入管道传输到档案或变数，并沿管道传递输入

Write-Output｜echo, write｜echo｜echo｜将字符串或其他对像打印到标准串流

Get-Process｜gps, ps｜tlist,｜ps｜列出所有正在执行的处理程序

Stop-Process｜spps, kill｜kill, taskkill｜kill｜停止正在执行的处理程序

Select-String｜sls｜findstr｜find, grep｜打印与模式匹配的行

Set-Variable｜sv, set｜env, export, set, setenv｜创建或更改环境变量的内容

Invoke-WebRequest｜iwr, curl, wget｜curl｜wget, curl｜取得互联网上的网页内容

## Windows PowerShell 3.0

PowerShell 3.0 与 Windows 8 和 Windows Server 2012 集成。微软还为 Windows 7 的 Service Pack 1、Windows Server 2008 的 Service Pack 1 和 Windows Server 2008 R2 的 Service Pack 1 提供了 PowerShell 3.0。

PowerShell 3.0 是一个更大的软件包 Windows Management Framework 3.0 (WMF3) (WMF3) 的一部分。

PowerShell 3.0 是一个更大的软件包 Windows 管理框架 3.0 (WMF3) 的一部分，其中还包含支持远程协作的 WinRM 服务。

PowerShell 3.0 的新功能包括：

- 计划任务：可使用 Windows 任务调度程序基础架构计划任务在预定的时间和日期运行。
- 会话重新连接：会话可以断开并重新连接。远程会话现在能更好地应对临时网络故障。
- 改进了代码编写：增加了代码自动完成（IntelliSense）和代码片段。PowerShell ISE 允许用户使用对话框填写 PowerShell cmdlet 参数。
- 授权支持：可将管理任务授权给无权执行此类任务的用户，而无需授予他们永久性的额外权限。
- 更新帮助：可使用 Update-Help 命令更新帮助文档。

## 安全性

PowerShell 5.1存在默认行为缺陷，攻击者通过社交工程诱导用户执行带污染参数的命令或恶意HTTP，可进行命令注入，该漏洞已在2025年12月修复。

## 外部链接

微软官网

- 如何使用 PowerShell 文件 - PowerShell | Microsoft Docs
- GitHub - PowerShell/PowerShell: PowerShell for every system!
- 易学易用的Windows PowerShell
- MSDN视频教程

其他

- PowerShell/PowerShell
- 维基： Windows PowerShell Survival Guide

## 基本资料

- screenshot caption：在Windows Terminal内运行的PowerShell 7
- 编程范型：命令式、管道、面向对象、函数式、反射式
- 发行日期：2006年11月14日
- 设计者：杰弗里·史诺威（Jeffrey Snover）、布鲁斯·帕耶特（Bruce Payette）、詹姆斯·特鲁赫（James Truher） (et al.)
- 开发者：Microsoft
- 类型系统：强类型、类型安全、类型推论和动态类型
- 平台：PowerShell: .NET、Windows PowerShell: .NET框架
- 许可证：MIT许可证（但Windows组件仍然是专有的）
- 受影响于：Ksh、Perl、IBM i 控制语言、DIGITAL命令语言、SQL、Tcl、Tk、Chef、Puppet
- 操作系统：Windows 7及其后续版本、Linux、macOS
- 类型：壳层、组态管理
- 文件扩展名：.ps1 (脚本文件)、.ps1xml（XML文档）、.psc1（控制台文件）、.psd1（数据文件）、.psm1（脚本模块）、.pssc（会话配置文件）、.cdxml (Cmdlet定义的XML文档)