Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

如何使用 Powershell 数组

如何使用 Powershell 数组

Dec 13, 2024

简介

数组是一种数据结构,可以一次容纳多个值。你可以把它理解为由相同或不同数据类型的元素组成的集合或列表。数组广泛用于许多脚本和编程语言,包括 Windows PowerShell。

让我们深入了解如何创建并使用 PowerShell 中的数组

创建对象数组

默认情况下,数组中的每个元素都是对象,而不是字符串或整数等其他数据类型。下面是一个通过显式添加对象来创建对象数组的示例:

      $people = @(

    [PSCustomObject]@{Name='Alice'; Age=30},

    [PSCustomObject]@{Name='Bob'; Age=25}
      

只包含一个元素的数组的创建

如果在变量中只放入一个值,PowerShell 就不会创建数组。为了确认这一点,让我们使用两个脚本并输出它们的数据类型。

首先,我们将在 PowerShell 中创建一个包含五个元素的数组:

      $array = @(1, 2, 3, 4, 5)

$array1.GetType()
      

现在,让我们尝试使用类似的脚本来创建只包含一个元素的数组:

      $array1 = 1

$array1.GetType()
      

从下面的输出可以看出,PowerShell 在第一个示例脚本中创建了数组(System.Array),但在第二个示例中没有。

Image

如果你想通过执行某个命令来检索对象并据此创建数组,那么这种行为尤其令人担忧,因为你无法事先知道结果中会返回多少个对象。

为了解决这个问题,你可以使用 ,(逗号)运算符。如果逗号被用作二元运算符,就会创建普通数组;如果被用作一元运算符,则数组只有一个元素。

例如,下面介绍如何获得只包含一个元素的数组:

      $array1 = ,1

$array1.GetType()
      

可以通过下面所示的输出确认数组已创建:

Image

创建空数组

在 PowerShell 中,还可以使用运算符 @ 来创建数组(包括空数组)。如果指定 @(),将得到一个完全不包含任何对象的数组。它是一种便捷的方法:先将变量初始化为数组,之后再向数组中添加对象,而无需担心对象的数量。

      $array3 = @()

$array3.GetType()
      
Image

创建强类型数组

默认情况下,数组的元素可以具有不同的数据类型。但你也可以创建只接受单一指定类型值的数组。尝试添加不同类型的值会产生错误。下面是创建最常见的强类型数组的方法:

整数:

      [int[]]$intArray = 1, 2, 3
      

字符串:

      [string[]]$strArray = "one", "two", "three"
      

日期/时间:

[datetime[]]$dateArray = (Get-Date), (Get-Date).AddDays(1)

创建多维数组(矩阵)

通过使用逗号嵌套数组,你可以将数据以行或列的形式进行结构化排列。这里我们创建一个 3×3 的矩阵:

$twoDArray = @(

@(1, 2, 3),

@(4, 5, 6),

@(7, 8, 9)

)

比较、分组、选择和排序数组

用于处理数组的其他有用 PowerShell cmdlet 包括:

  • Compare-Object — 比较两个数组并返回差异。
  • Group-Object — 根据属性值对数组元素进行分组。
  • Select-Object — 选择对象或对象集合的指定属性;也可用于从数组中选择特定数量的元素。
  • Sort-Object — 用于对仅包含一种数据类型的数组进行排序,如下所示:
      $array = @(3, 1, 4, 2)
$sortedArray = $array | Sort-Object
      
Image

遍历数组

为了按顺序逐个处理数组中的每个元素,我们需要使用 foreach 运算符创建一个循环。例如,如果我们声明一个字符串数组,并希望统计数组中每个单词的长度,就应该运行以下脚本:

      $array8 = @("Earth","Mercury","Venus","Jupiter","Saturn","Mars", "Neptune", "Pluto")
foreach ($array in $array8) {
 "$array = " + $array.length
}
      

结果将如下所示:

Image

使用管道(Pipeline)

在 PowerShell 中使用管道(pipeline),将一个命令的输出作为另一个命令的输入来传递。处理数组时,你可以使用管道来处理并操作数组中的数据,然后将结果分配给新的数组,或修改现有数组。

这里我们将把每个数组项都乘以 2:

      $numbers = 1,2,3,4,5

$doubled = $numbers | ForEach-Object { $_ * 2 }
      
Image

向数组添加元素

在 PowerShell 中,数组的大小一旦定义就不可变。不过,运算符 += 使您能够通过向现有数组追加项目来创建一个新的数组——本质上是创建一个新的合并数组。

      $array = @(1, 2, 3)
$array += 4
      
Image

创建 ArrayList

对于大型数组或需要频繁添加的场景,使用 += 可能会带来性能方面的担忧,因为每次使用它时都会创建一个新的数组:会复制旧的元素,然后把新的元素添加到末尾。在这些情况下,您可能希望使用 ArrayList。

ArrayList 的大小是可变的,因此您可以在不必重新创建整个集合的情况下添加或移除项目。和标准数组一样,ArrayList 也可以容纳不同数据类型的项目。

用于创建 ArrayList 的 cmdlet 如下:

      $array3 = New-Object System.Collections.ArrayList

      

申请 Netwrix Directory Manager 免费试用

从数组中移除一个元素

现在我们使用 ArrayList 从数组中移除一个元素。先创建一个数组。

      $array5 = "one", "two", "three", "four", "five"
$array5.gettype()
      

现在我们将把它添加到一个 rrayList 中,这样就能轻松修改它。

      [System.Collections.ArrayList]$ArrayList1 = $array5

$ArrayList1.GetType()
      

然后使用 .Remove 命令。

      $ArrayList1.Remove("three")

      
Image

清空数组

没有定义用于删除数组的方法,但可以通过多种方式去除数组中的内容(清空它)。一种方法是将变量 $null 赋给该数组:

      $array7 = $null
$array7
      

下面是清空数组的另一种方法:

      $array = @("element1", "element2", "element3")

$array = @()
      

下面是如何清空 ArrayList:

      $arrayList = New-Object System.Collections.ArrayList
$arrayList.Add("element1")
$arrayList.Add("element2")
$arrayList.Clear()
      

打印数组

显示数组内容的最简单方法是直接引用数组变量。下面的示例展示了如何在数组中每个元素前包含文本“Element:”:

Image

要写入 .txt 文件,请使用 Out-File 命令:

      $var5 | Out-File C:scriptsarray.txt

      

要导出到 .csv 文件,请使用 Export-Csv 命令:

      $var6 | Export-Csv -Path C:scriptsarray.csv

      

筛选数组

我们可以使用 Where-Object cmdlet 只从数组中检索偶数:

      $numbers = 1,2,3,4,5,6

$evenNumbers = $numbers | Where-Object { $_ % 2 -eq 0 }

$evenNumbers
      
Image

另外,我们也可以使用 .Where() 方法,它不需要管道:

      $numbers = 1,2,3,4,5,6

$evenNumbers = $numbers.Where({ $_ % 2 -eq 0 })

$evenNumbers

      

检查数组的长度

要返回数组中的元素数量,请使用 .length 参数:

      $array6 = 1,2,3,4,5,6
echo $array6.Length
      
Image

检查数组是否包含特定的值

如果你想查看数组中的任意元素是否包含某个特定值,请使用 Contains 方法。此代码将显示数组是否包含 2 或 12:

      $array7 = 1,2,5,8,3,4,5
$array7.Contains(2)
$array7.Contains(12)
      
Image

使用数组索引访问元素

和大多数编程语言一样,PowerShell 数组中的每个元素都可以通过索引来访问。数组的索引从 0 开始,因此在包含三个元素的数组中,第一个元素在索引 0,第二个元素在索引 1,第三个元素在索引 2。

要使用数组索引访问元素,需要在数组变量后面的方括号中提供索引。下面是一个示例,展示如何创建一个数组并显示第二个元素:

      $colors = "Red", "Green", "Blue", "Yellow"

$secondColor = $colors[1]

Write-Output $secondColor
      
Image

你可以通过使用负索引从数组末尾访问元素。-1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。

使用 Join 运算符和 Split 运算符

在 PowerShell 中,join 运算符用于将字符串数组追加到一个单独的字符串中,可选择使用指定的分隔符。下面是一个不使用分隔符的示例。

      $array = "Power", "Shell"

$joined = $array -join ""

# Output: "PowerShell"
      

下面是使用分隔符时的效果:

Image

split 运算符基本上会执行 join 运算符的相反操作,如下例所示:

      $string = "apple,banana,grape"
$fruits = $string -split ","
      
Image

使用 Replace 运算符

replace 运算符用于将一个字符串替换为另一个字符串。下面是 cmdlet 的结构:

      <originalString> -replace <patternToFind>, <replacementString>

      

下面是一个示例,它会将“Hello World”替换为“PowerShell”:

      $string = "Hello World"

$newString = $string -replace "World", "PowerShell"

      
Image

切片数组

您可以通过指定范围来创建子数组,如下所示:

      $array = 1,2,3,4,5,6,7,8,9

$subset = $array[3..6]

      

反转数组

下面是一个示例,展示如何反转数组中元素的顺序:

      $numbers = 1..5

[Array]::Reverse($numbers)
      

结论

数组是大多数脚本和编程语言中的基础数据结构,因为它能让你存储、检索并操作由多种数据类型组成的一组项目。理解数组将提升你使用 PowerShell 自动化任务的能力。

现在 Netwrix 可以帮助你

需要更高效、更有效地保护你的 Active Directory 和 Entra ID (Azure AD) 环境吗?考虑 Netwrix Directory Manager。其自动化的组和用户管理功能可降低 data breach 的风险,同时消除耗时的手动管理任务。

Netwrix Directory Manager 让你能够:

  • 将来自人力资源信息系统(HRIS)的用户预配与取消预配自动化到 Active Directory、Entra ID 以及启用 SCIM 的应用程序,从而让新员工更快进入高效状态,并大幅降低对手接管过期身份的风险。
  • 根据 HRIS 中记录的员工晋升或调岗等变化,自动更新目录组。此自动化可在安全与合规所需的情况下,以接近实时的方式让访问权限保持最新,同时节省 IT 团队的时间。
  • 将组和用户管理委派给最了解“谁应该访问什么”的人员。简单的工作流使业务部门负责人能够查看各自的组,并批准或拒绝用户的访问请求,从而降低目录中出现过度特权组和用户的风险。
  • 通过自动化的用户创建、到期与删除,让目录保持整洁,并更易于管理。
  • 借助深度洞察、有效的自动化,以及关于组与成员的清晰报表,维护并证明对法规与标准的合规性。

掌握 Windows PowerShell 脚本编写基础

了解更多



分享到

了解更多

关于作者

Asset Not Found

Jonathan Blackwell

软件开发负责人

自 2012 年以来,工程师兼创新者 Jonathan Blackwell 一直提供工程领导力,使 Netwrix GroupID 成为 Active Directory 和 Azure AD 环境中群组与用户管理领域的领先者。他在研发、市场与销售方面的经验,使 Jonathan 能够全面理解 Identity 市场以及买家如何思考。