首页/系统/Windows 运维速查/数组定义与常用操作
PowerShell 基础66 条

数组定义与常用操作

数组用逗号或 @() 定义:索引、切片、倒序与长度统计;注意 += 会新建数组而非原处追加。

Windows 运维速查系统更新于 2026-10-13

概念是什么

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,不要手工遍历比较。

易错点

  • 单元素数组与标量难以区分,未用 @() 包裹时 Count 会返回空或报错
  • 循环里连续 += 会反复复制数组,数据量一大性能急剧下降
  • 取值前不校验元素个数,空数组返回 $null 会让后续逻辑静默出错
  • 以为数组能自动扩容,实际长度固定,追加只是重建一个新数组

数据来源与参考

  • Microsoft Learn:about_Arrays

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌