跳到主要内容

基础语法

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 内置了一些特殊变量:

变量说明
$_管道中的当前对象
$?上一条命令的执行状态(truetrue 或 false)
$LASTEXITCODE上一条外部程序的退出码
$null空值
$true / $false布尔值
$PWD当前目录
$HOME用户主目录
$HOST当前主机信息
$PID当前进程 ID
$PSVersionTablePowerShell 版本信息

$_ 是最常用的特殊变量,在管道操作和循环中代表当前处理的对象:

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

  • $false
  • 00.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

下一步

掌握了基础语法后,接下来学习 控制流,了解条件判断和循环结构。