PowerShell 是一种跨平台的任务自动化解决方案,由命令行 shell、脚本语言和配置管理框架组成。 PowerShell 在 Windows、Linux 和 macOS 上运行。
不同于其他 shell 处理文本, powershell 处理对象。且内置大量命令, 这个是其他 shell 所匮乏的。powershell 支持循环, 条件, 控制流, 变量等语言特性。
PowerShell 有四种类型的命令:脚本、函数和方法、cmdlet 和本机命令。
-
命令文件称为脚本。 根据约定,脚本的文件名扩展名为 .ps1。 PowerShell 程序的最顶层是脚本,而脚本又可以调用其他命令。
-
PowerShell 支持通过命名过程进行模块化编程。 用 PowerShell 编写的过程称为函数,而由执行环境提供的外部过程(通常用其他语言编写)称为方法 。
-
cmdlet(读作“command-let”)是一种简单的单任务命令行工具。 尽管 cmdlet 可以独自使用,但 cmdlet 的完整功能是在对其进行组合使用来执行复杂任务时实现的。
-
本机命令是内置于主机环境的命令。
每次 PowerShell 运行时环境开始执行时,它都会建立会话。 然后,命令在该会话的上下文中执行。
跨平台
powershell 基于 dotnet 平台构建, 所有 powershell 也是跨平台的。
- PowerShell 7.3 - 基于 .NET 7.0 构建
- PowerShell 7.2 (LTS-current) - 基于 .NET 6.0 (LTS-current) 构建
- PowerShell 7.1 - 基于 .NET 5.0 构建
- PowerShell 7.0 (LTS) - 基于 .NET Core 3.1 (LTS) 构建
- PowerShell 6.2 - 基于 .NET Core 2.1 构建
- PowerShell 6.1 - 基于 .NET Core 2.1 构建
- PowerShell 6.0 - 基于 .NET Core 2.0 构建
windows 平台同 linux、macos 基于的 dotnet 差异, 导致脚本存在兼容性挑战, 可以参考微软官方迁移说明。另外可以参看 windows 和 linux、macos 差异。
安装
查看版本
echo $psversiontable
echo $host
使用 winget 安装
#搜索版本
winget search Microsoft.PowerShell
#安装
winget install --id Microsoft.Powershell --source winget
winget install powershell
使用 msi 安装包安装
https://github.com/PowerShell/PowerShell/releases/download/v7.3.4/PowerShell-7.3.4-win-x64.msi
卸载
- 依然可以通过 winget 卸载
- windows 系统卸载工具
开发工具
- ISE
ISE 为 windows powershell 集成开发环境, 提供图形界面, 编写, 测试, 上下文提示, 帮助等。按照如下方式可以启动 ISE。更多
运行--> powershell_ise.exe
- vscode + powershell 插件
借助插件, 可以提供提示, 执行, 语法高亮等功能, 笔者建议使用 vscode 编写 powershell 脚本。不过插件仅支持:更多
- PowerShell 7.2 及更高版本(Windows、macOS 和 Linux)
- 具有 .NET Framework 4.8 的 Windows PowerShell 5.1(仅限 Windows)
启动 powershell
自 powershell 6.0 开始, powershell 二进制文件重命名为 pwsh.exe(windows) 和 pwsh(linux, macos)。6.0 以下名称为 powershell。
DSC
PowerShell Desired State Configuration, 为系统和软件管理部署和管理配置数据。ref1ref2
WMF
获取帮助
- get-help/help/man
查看格式, 参数, 例子等
man commandname -online
man commandname
get-help commandname
help commandname
- get-command/gcm
查看命令类型, 名字别名, 版本, 源码等信息, 可以使用多种方式过滤
- -verb 动词过滤
- -name 名字过滤(可省略)
- -module 模块过滤
- -noun 名词过滤
- -ListImported 导入的命令
也可以查看额外信息
- -ParameterName 参数
- -Syntax 语法
- -ParameterType 参数类型
- -ShowCommandInfo
详情请参看在线文档 man get-command -online
gcm #查看所有命令
gcm commandname #指定命令
gcm -verb get #指定动词的所有命令
get-member
获取对象的属性和方法
Get-Member
[-InputObject <PSObject>]
[[-Name] <String[]>]
[-MemberType <PSMemberTypes>]
[-View <PSMemberViewTypes>]
[-Static]
[-Force]
[<CommonParameters>]
get-help | get-member
基础
扩展名
.ps1
便捷别名
在 Windows 上,为了方便用户,PowerShell 提供一组映射到 Linux 命令名的别名。ls
、cp
、mv
、rm
、cat
、man
、mount
、ps
…
执行策略
执行策略可以防止 powershell 脚本被无意执行, 有两种执行策略
- Restricted 不能执行脚本
- RemoteSigned 可以执行脚本
查看
Get-ExecutionPolicy
设置
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
管道
符号 |
连接两个命令, 左边命令的输出重定向作为右边命令的输入。常规意义的输入输出均为文本, 但 powershell 的输入输出是对象, 可以使用 man command -full
查看帮助, 重点关注 INPUTS
OUTPUTS
, 这里写了接受什么类型的管道输入,以及哪些参数可以使用管道。
按值(类型)绑定
默认按值绑定管道参数。假设 command 有两个参数 -name namestring, -inputobject object, 如果管道输入的是 string 则会把值绑定到 -name 参数, 否则绑定到 -inputobject。
按属性名绑定
如果传入的参数是个对象, 里边包含 name 属性, 则会把该对象的 name 属性绑定到 -name 参数。
NuGet
NuGet 为 powershell 模块、项目仓库, 等同于 java 世界的 maven 仓库, 可以使用 PowerShellGet
模块进行管理。
- 发现
find-module -name name
- 安装
Find-Module -Name MrToolkit | Install-Module
单、双引号
一般单双引号都可使用, 均表示字符串, 但存在些许差异
- 单引号中无法使用 $variable, 会原样展示
cmdlet
PowerShell 中的编译命令称为 cmdlet。 Cmdlet 的发音为“command-let”(而不是 CMD-let)。 Cmdlet 名称采用单数形式的“动词-名词”命令形式,这样更易于被发现。 例如,用于确定正在运行哪些进程的 cmdlet 是 Get-Process,而用于检索服务及其状态的列表的 cmdlet 是 Get-Service。 PowerShell 中还有其他类型的命令(例如别名和函数),本书后面部分将对其进行介绍。 术语 PowerShell 命令是一个通用术语,通常用于指代 PowerShell 中任何类型的命令,不管是 cmdlet、函数还是别名。
实际使用中, cmdlet 命令可以首字母大写,也可以全小写, 即 get-process
和 Get-Process
都有效。