概念是什么
PowerShell 数组是有序集合:用逗号或 @() 构造,索引从 0 开始,负数索引从末尾取,[1..3] 做切片。理解它的关键点是长度固定——+= 实际是新建一个更大的数组再复制内容,因此不适合高频追加。
什么时候改用 List
需要在循环中持续追加元素时,应改用 [System.Collections.Generic.List[object]]::new() 或 ArrayList:它们的 Add 方法不会复制已有元素,复杂度接近常数。数组适合“一次成形、只读遍历”,List 适合“逐步收集、边跑边加”,结构选错是脚本随数据量增长而明显变慢的主因。
基本信息
| 适用平台 | PowerShell 2.0 及以后 |
|---|---|
| 语法 | $a = 1,2,3;$a = @(命令);$a[0];$a[-1];$a[1..3];$a.Count |
| 切片语法 | $a[1..3] 取区间,$a[-1] 取末元素,$a[0,2] 取指定下标 |
| 相关类型 | [System.Collections.ArrayList] 与泛型 List 支持高效追加 |
典型使用场景
- 批量保存端口、主机名或路径清单,随后循环遍历
- 接收管道输出:$svcs = Get-Service 会自动成为数组
- 取首尾元素做校验,例如取最新一条记录
- 用切片抽取一部分做抽样检查
- 与 Compare-Object 配合,对比两份清单的差异
常用示例
常用示例
$ports = 80,443,8080
$ports[0] # 80,第一个元素
$ports[-1] # 8080,最后一个元素
$svcs = Get-Service | Select-Object -ExpandProperty Name
$svcs.Count # 元素总数
$ports[0..1] # 切片:前两个元素
foreach ($p in $ports) { "端口 $p" }常用操作读法
| 写法 | 含义 | 注意 |
|---|---|---|
| $a = 1,2,3 | 直接构造数组 | 元素类型可以不一致 |
| @(命令) | 强制转换为数组 | 结果为空时仍保证是数组 |
| $a[-1] | 取最后一个元素 | 空数组会得到 $null |
| $a.Count | 元素个数 | 单元素场景建议用 @() 包住 |
| $a += 值 | 新建更大的数组 | 循环中高频使用性能差 |
单元素结果与标量在外观上无法区分,用 @() 包裹可以保证类型稳定,避免下游的 Count 或索引操作报错。
循环里连续使用 += 会反复复制整个数组,元素多时开销接近平方级;高频追加应改用 ArrayList 或泛型 List。
范围切片越界不会报错,只会静默返回可用的那部分元素;依赖切片长度做判断的逻辑要显式校验 Count。需要去重时用 Select-Object -Unique 或 Sort-Object -Unique,不要手工遍历比较。