基础语法
PowerShell 的语法设计兼顾了命令行的简洁性和脚本语言的强大功能。本章将介绍变量定义、数据类型、运算符等基础知识,这些是编写 PowerShell 脚本的基石。
变量
变量定义
PowerShell 中的变量以 $ 符号开头,无需预先声明类型,系统会根据赋值自动推断:
$name = "PowerShell"
$version = 7.4
$isRunning = $true
变量名不区分大小写,$Name 和 $name 指向同一个变量。变量名可以包含字母、数字和下划线,但不能以数字开头。
强类型变量
虽然 PowerShell 会自动推断类型,但也可以显式指定类型,这样可以获得类型检查和自动类型转换:
[int]$count = 10
[string]$message = "Hello"
[bool]$enabled = $true
[datetime]$created = Get-Date
指定类型后,赋值时会自动进行类型转换:
[int]$number = "123"
$number
输出:
123
如果转换失败,会抛出错误:
[int]$number = "abc"
错误信息:
Cannot convert value "abc" to type "System.Int32"
变量的常用方法
使用 Get-Variable 查看变量信息:
Get-Variable -Name name
使用 Remove-Variable 删除变量:
Remove-Variable -Name name
使用 Clear-Variable 清空变量值:
Clear-Variable -Name name
特殊变量
PowerShell 内置了一些特殊变量:
| 变量 | 说明 |
|---|---|
$_ | 管道中的当前对象 |
$? | 上一条命令的执行状态(false) |
$LASTEXITCODE | 上一条外部程序的退出码 |
$null | 空值 |
$true / $false | 布尔值 |
$PWD | 当前目录 |
$HOME | 用户主目录 |
$HOST | 当前主机信息 |
$PID | 当前进程 ID |
$PSVersionTable | PowerShell 版本信息 |
$_ 是最常用的特殊变量,在管道操作和循环中代表当前处理的对象:
Get-Process | Where-Object { $_.CPU -gt 100 }
这里 $_ 代表管道中传递的每个进程对象。
数据类型
PowerShell 建立在 .NET 之上,支持所有 .NET 数据类型。
数值类型
[int] $integer = 42
[long] $bigNumber = 9223372036854775807
[double] $decimal = 3.14159
[decimal] $precise = 3.14159265358979323846m
数值类型支持科学计数法:
$scientific = 1.5e10
字符串类型
PowerShell 支持两种字符串:单引号字符串和双引号字符串。
单引号字符串:内容原样输出,不进行变量替换:
$name = "World"
$message = 'Hello, $name'
$message
输出:
Hello, $name
双引号字符串:支持变量替换和转义字符:
$name = "World"
$message = "Hello, $name"
$message
输出:
Hello, World
双引号字符串中的转义字符使用反引号(`):
"Line1`nLine2"
"Tab`tSeparated"
"Path: C:\Users`\$env:USERNAME"
常用转义字符:
| 转义字符 | 说明 |
|---|---|
`n | 换行 |
`t | 制表符 |
`r | 回车 |
`" | 双引号 |
`$ | 美元符号 |
`` | 反引号本身 |
Here-String:多行字符串,适用于包含大量文本或引号的情况:
$multiline = @"
这是第一行
这是第二行
变量替换: $name
"@
单引号版本的 Here-String 不进行变量替换:
$literal = @'
这是第一行
变量不会被替换: $name
'@
数组
PowerShell 数组使用 @() 语法或逗号分隔创建:
$numbers = 1, 2, 3, 4, 5
$strings = @("apple", "banana", "cherry")
$empty = @()
$mixed = @("text", 123, $true)
访问数组元素(索引从 0 开始):
$fruits = "apple", "banana", "cherry"
$fruits[0]
$fruits[-1]
$fruits[0..2]
输出:
apple
cherry
apple
banana
cherry
数组是固定大小的,添加元素会创建新数组:
$numbers = 1, 2, 3
$numbers += 4
对于需要频繁修改的集合,建议使用 System.Collections.Generic.List:
$list = [System.Collections.Generic.List[int]]::new()
$list.Add(1)
$list.Add(2)
$list.Add(3)
哈希表
哈希表(关联数组)存储键值对:
$person = @{
Name = "张三"
Age = 30
City = "北京"
}
访问哈希表值:
$person["Name"]
$person.Name
$person.Keys
$person.Values
添加和修改键值对:
$person["Email"] = "[email protected]"
$person.Age = 31
遍历哈希表:
foreach ($key in $person.Keys) {
Write-Host "$key: $($person[$key])"
}
布尔类型
PowerShell 的布尔值为 $true 和 $false。在条件判断中,以下值被视为 $false:
$false0或0.0- 空字符串
"" $null- 空数组
@() - 空哈希表
@{}
其他值被视为 $true。
运算符
算术运算符
$a = 10
$b = 3
$a + $b # 加法: 13
$a - $b # 减法: 7
$a * $b # 乘法: 30
$a / $b # 除法: 3.333...
$a % $b # 取模: 1
字符串也支持 + 和 * 运算:
"Hello" + " " + "World"
"-" * 20
比较运算符
PowerShell 的比较运算符以 - 开头,后面跟操作符名称:
| 运算符 | 说明 | 示例 |
|---|---|---|
-eq | 等于 | 5 -eq 5 → $true |
-ne | 不等于 | 5 -ne 3 → $true |
-gt | 大于 | 5 -gt 3 → $true |
-ge | 大于等于 | 5 -ge 5 → $true |
-lt | 小于 | 3 -lt 5 → $true |
-le | 小于等于 | 3 -le 5 → $true |
比较运算符默认不区分大小写,如需区分大小写,在运算符前加 c:
"Hello" -eq "hello"
"Hello" -ceq "hello"
明确不区分大小写,在运算符前加 i:
"Hello" -ieq "hello"
字符串运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
-like | 通配符匹配 | "hello" -like "h*" → $true |
-notlike | 通配符不匹配 | "hello" -notlike "w*" → $true |
-match | 正则匹配 | "hello123" -match "\d+" → $true |
-notmatch | 正则不匹配 | "hello" -notmatch "\d+" → $true |
-replace | 正则替换 | "hello123" -replace "\d+", "456" → "hello456" |
-split | 分割字符串 | "a,b,c" -split "," → @("a","b","c") |
-join | 连接数组 | @("a","b","c") -join "-" → "a-b-c" |
通配符说明:
*匹配任意字符?匹配单个字符[a-z]匹配字符范围
包含运算符
检查集合是否包含某元素:
$fruits = "apple", "banana", "cherry"
$fruits -contains "banana"
$fruits -notcontains "orange"
"apple" -in $fruits
"orange" -notin $fruits
逻辑运算符
$a = $true
$b = $false
$a -and $b
$a -or $b
-not $a
!$a
位运算符
10 -band 3
10 -bor 3
10 -bxor 3
-bnot 10
类型运算符
检查对象的类型:
123 -is [int]
"hello" -is [string]
123 -isnot [string]
范围运算符
生成连续数字序列:
1..5
5..1
'a'..'e'
类型转换
显式转换
[int]"123"
[string]123
[datetime]"2024-01-15"
[bool]1
使用 -as 运算符
-as 运算符尝试转换类型,失败时返回 $null 而不是报错:
"123" -as [int]
"abc" -as [int]
常用类型加速器
PowerShell 提供了类型加速器简化常用 .NET 类型的引用:
[adsi]
[wmiclass]
[xml]
[scriptblock]
[hashtable]
[pscustomobject]
表达式
子表达式
使用 $() 在字符串中执行表达式:
$result = "2 + 2 = $(2 + 2)"
$result
输出:
2 + 2 = 4
数组子表达式
@() 确保结果始终是数组:
$result = @(Get-Process chrome)
$result.Count
下一步
掌握了基础语法后,接下来学习 控制流,了解条件判断和循环结构。