PowerShell
PowerShell似乎借鉴了很多Bash的设计, 许多特性在PowerShell里以相同的形式存在.
- 由于Powershell的命令过多, 且命令的名称普遍冗长, 命令的缩写形式很难记忆,
这导致在终端里编写Powershell命令组合很容易丧失理智, 经常需要将命令组合编写成脚本文件.
与之相对的, Bash/Zsh命令 + GNU程序很容易在终端里编写和执行. - 社区偏小, 对于Powershell的很多问题, 在StackOverflow里都无法找到好的答案.
好在New Bing这样的LLM可以替用户快速生成PowerShell脚本.
PowerShell的
PowerShell从v3开始, 可以通过
help
/ man
/ Get-Help
, 用于查看命令相关的手册内容.PowerShell从v3开始, 可以通过
Update-Help
来在线更新手册内容.help支持通配符, 可以用
help *log*
查找所有名字里包含log的命令.查找命令示例
help Get-Command -example
.用
Get-Alias
命令可以查找到所有别名.PowerShell的Windows版本内置一个
Show-Command
命令, 该命令可以弹出一个用户界面, 可用于填写命令的参数.echo ` Line1 ` Line2
PowerShell的主要特点是它的命令输出是对象而不是文本.
列出对象的所有成员的名称, 成员类型, 类型定义.
这个命令最常见的用法是接在管道后面, 例如
这个命令最常见的用法是接在管道后面, 例如
Get-Process | gm
.选择对象的属性列, 例如
Get-Process | select name, id
可以只列出进程名和id.该命令会弹出一个网格UI, 用户可以在UI里执行过滤, 排序等数据查看操作.
$colorPicker = @('blue', 'white', 'yellow', 'black')# 等同于$colorPicker = 'blue', 'white', 'yellow', 'black'# 访问数组成员$colorPicker[0] # 'blue'$colorPicker[1..3] # 'white', 'yellow', 'black'# 尾部追加# PowerShell里的数组是定长的, 每次向数组添加新的成员时, 都是在重新创建数组.$colorPicker = $colorPicker + 'orange'# 等同于$colorPicker += 'orange'# 连结两个数组$colorPicker = $colorPicker + @('pink', 'cyan')# 获得数组长度$colorPicker.Length
通过借用.Net的数据结构, 可以在PowerShell里使用变长数组.
$colorPicker = [System.Collections.ArrayList] @('blue', 'white', 'yellow', 'black')# 尾部追加$colorPicker.Add('gray')
$users = @{ foo = 'bar' baz = 'qux'}$users['foo'] # 'bar'$users.foo # 'bar'$users.Keys # 'foo', 'bar'$users.Values # 'bar, 'qux'$users.Add('key', 'value')$users['key'] = 'value'$users.ContainsKey('foo')$users.Remove('foo')
括号内的命令会被优先执行, 然后其输出会被填到相应的位置上:
echo (cat text.txt)
$true
, $false
.PowerShell还会隐式将任何类型视为布尔值.
PowerShell里的单引号字符串不会插入变量, 双引号字符串会插入变量, 跟Bash表现一致.
$null
上一个命令的退出状态码.
if (...) { # ...} elseif (...) { # ...} else { # ...}
switch (...) { expression1 { # ... break } expression2 { # ... break } default { # ... }}
foreach ($element in $collection) { # ...}
for ($i = 0; $i -lt 10; $i++) { # ...}
$counter = 0while ($counter -lt 10) { # ... $counter++}
do { # ...} while (...)
do { # ...} until (...)
# 最佳实践: 让PowerShell在出现错误后停止运行脚本, 该变量的默认值为'Continue'.$ErrorActionPreference = 'Stop'# 可以通过给命令设置`-ErrorAction`参数来临时改变一条命令出现错误时采取的行为.Get-ChildItem -Path $folderPath -ErrorAction Continue
try { # ...} catch { # 获得异常 $_.Exception # ...} finally { # ...}
一个数组类型的自动变量, 当前会话里的所有错误都会被保存进去.
索引越小的错误越新.
索引越小的错误越新.
PowerShell里提供的类似于lambda表达式的代码块, 常用于
Where-Object
这样的命令.例子:
Get-Serivce | Where-Object {$_.Status -eq 'Running'}
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions
# 参数写法1 (官方手册推荐这种写法, 但实在很丑)function <name> { param ( [type]$parameter1 [, [type]$parameter2] ) <statement list>}# 参数写法2function <name> [([type]$parameter1[, [type]$parameter2])] { <statement list>}
从控制台获得用户输入.
在控制台输出内容.
在控制台输出内容.
这个命令与
Write-Output
的区别在于, 该命令会绕过管道系统, 因此无法被其他命令获取到输出内容.调用命令.
访问类的静态成员.
范围运算符,
1..3
相当于 1, 2, 3
类型检查.
类型转换.
文本格式化运算符.
即函数式编程中的map.
即函数式编程中的filter.
指代管道中当前的对象.