当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 中 ForEach 和 ForEach-Object 之间的区别

作者:精品下载站 日期:2024-12-14 05:53:45 浏览:15 分类:玩电脑

PowerShell 中 ForEach 和 ForEach-Object 之间的区别


您可以在 PowerShell 脚本中使用 ForEach 语句和 ForEach-Object cmdlet。它们都使用循环来迭代数据,但这些循环是不同的。在本文中,您将了解 PowerShell 中 Foreach 和 ForEach-Object 之间的区别。

ForEach 与 ForEach-Object PowerShell

您可以使用 PowerShell 中的 ForEach 语句或 ForEach-Object cmdlet 来迭代对象集合。最大的区别是,您可以在 PowerShell 命令行的开头使用 ForEach 语句,而 ForEach-Object cmdlet 只能在管道之后使用。

下表显示了 ForEachForEach-Object 之间的差异。

Beginning of a command line

一条管道后

Fast

慢的

读完本文后,您应该知道如何在 PowerShell 中使用 ForEachForEach-Object。如果您已经有一个数组,请使用 ForEach 语句。如果您有管道输入并想要导出结果,请使用 ForEach-Object。

PowerShell Foreach 语句

ForEach 语句用于迭代数据集合,例如项目、邮箱或用户的列表。

如何在 PowerShell 中创建数组

数组是对象(成员)的集合。通常,您使用数组来分组或绑定一个或多个对象。当您使用ForEach语句时,它将引用数组中的每个成员。

数组对象的一些示例:

  • 用户
  • 在线交换邮箱
  • 文件中的一行
  • 操作系统进程

数组可以是特定对象或特定对象的子集。例如,所有的Exchange Online邮箱都是一个数组,它是一个特定的对象。如果您只需要用户邮箱,它们也可以是一个数组,它是 Exchange Online 邮箱的子集。

[玩转系统] PowerShell 中 ForEach 和 ForEach-Object 之间的区别

您可以使用不同的方法来创建数组:

  1. 使用基本的 PowerShell 命令并使用数组。例如,每个以 Get 开头的 PowerShell cmdlet。
  2. 特定格式的信息数据(例如 CSV 文件)也可以是数组。当您打开 CSV 文件时,它具有行和列,其中每个代表一个成员数组。每列代表一个成员属性。
  3. 使用实际上是一个数组。组充当包含组成员的逻辑容器,它是一个数组。
  4. 如果您手动编写以逗号字符分隔的每个成员,您还会创建一个多个用户的数组。

使用PowerShell命令创建数组

默认情况下,当您使用 Get PowerShell cmdlet 时,它将创建一个数组。当我们使用 PowerShell cmdlet(例如 Get-Mailbox)时,我们要求提供有关非常特定的对象类型(Exchange 邮箱)的信息。 PowerShell 会自动创建一个阵列空间,并用有关所有现有 Exchange 邮箱的信息填充阵列存储。然后,您可以将数组信息导出到文件或通过管道将信息传递到另一个 PowerShell 命令。

在我们的示例中,我们将使用特定属性RecipientTypeDetails。如果您只想获取 Exchange Online 邮箱的特定子集或组(例如用户邮箱),则需要创建一个阵列。我们将在 PowerShell 命令中使用 -Filter 搜索参数。

以下 PowerShell 命令将获取 Exchange Online 中所有用户邮箱的列表。

Get-Mailbox -ResultSize Unlimited -Filter { (RecipientTypeDetails -eq "UserMailbox") }

您还可以使用另一个 -Filter 搜索参数创建 PowerShell 命令。

另一个示例是获取所有 Exchange Online 用户的列表,但添加筛选器仅获取来自 IT 部门 的用户。

Get-User -ResultSize Unlimited -Filter 'Department -eq "IT"'

让我们看看下一步如何将这些 PowerShell 命令用作数组。

使用PowerShell变量创建数组

变量是经常与PowerShell ForEach语句一起使用的重要组件。 PowerShell变量作为逻辑容器,存储数组成员的信息数据。

请执行以下步骤来定义 PowerShell 变量:

  • 使用$符号显示变量。
  • 定义与数据相关的变量名称。变量名不区分大小写。变量名可以包含空格和特殊字符,但这些很难使用,应该避免。
  • 使用 PowerShell Get 命令获取有关特定对象的数据。 PowerShell 命令的输出将存储在该变量中。

PowerShell 变量语法示例。

$ExchangeMailboxes = Get-Mailbox -ResultSize Unlimited

在上面的示例中,我们有一个名为 $ExchangeMailboxes 的变量,用于存储来自 Get-Mailbox PowerShell cmdlet 的信息。

当我们运行 $ExchangeMailboxes 变量时,它将显示所有邮箱。

$ExchangeMailboxes

使用数组的 PowerShell ForEach 循环

有时,您必须使用 PowerShell 命令对一组对象(数组)执行批量操作。

如果需要在数组上多次运行某个任务,最好将 Foreach 语句与 变量 组合起来存储数组数据(成员)。

使用带有变量的 ForEach 循环定义 PowerShell 命令:

  • 命名用于存储Get PowerShell 命令结果的变量。
  • 开始 ForEach 语句,后跟括号 ( )。定义另一个变量的名称,例如 $Member,来表示数组中的每个成员。
  • 对数组执行操作的 PowerShell 命令必须括在大括号 { } 中。当您使用 ForEach 语句时,它将为数组中的每个成员单独执行 PowerShell 命令。

PowerShell ForEach 语法示例。

$VariableName = Get PowerShell command
ForEach ($Member in $VariableName) {
    #PowerShell command perform the operation
}

我们将在下一步中使用上述 PowerShell ForEach 语法。

使用 ForEach 循环指定 Array 对象

数组是对象的集合,例如所有用户或成员。该阵列中的每个用户都是阵列成员

[玩转系统] PowerShell 中 ForEach 和 ForEach-Object 之间的区别

我们将向您展示两种显示数组成员的方法。

方法一:查看特定数组成员

在我们的示例中,变量 $ExchangeMailboxes 代表数组,但变量 $ExchangeMailbox 代表数组中的每个成员。

运行以下 PowerShell 脚本以获取所有数组成员的列表。

$ExchangeMailboxes = Get-Mailbox -ResultSize Unlimited
ForEach ($ExchangeMailbox in $ExchangeMailboxes) {
    $Member
}

要查看特定的数组成员,您可以显示变量 $ExchangeMailboxes 中存储的内容。运行以下 PowerShell 命令以查看第一个数组成员。

$ExchangeMailboxes[0]

PowerShell 输出显示以下结果。

Name                      Alias       Database           ProhibitSendQuota    ExternalDirectoryObjectId
----                      -----       --------           -----------------    -------------------------
0de964ae-f09a-4e65-bc8c-… Adam.Mackay EURPR02DG610-db026 99 GB (106,300,440,… 0de964ae-f09a-4e65-bc8c-cbeac2745e4c

运行以下 PowerShell 命令以查看第二个 数组成员。

$ExchangeMailboxes[1]

PowerShell 输出结果。

Name                      Alias       Database           ProhibitSendQuota    ExternalDirectoryObjectId
----                      -----       --------           -----------------    -------------------------
0de964ae-f09a-4e65-bc8c-… Adam.Mackay EURPR02DG610-db026 99 GB (106,300,440,… 0de964ae-f09a-4e65-bc8c-cbeac2745e4c

方法2:使用write-host显示所有数组成员

您可以将写入主机添加到第 3 行的 $member 变量中。

运行以下 PowerShell 脚本以获取所有阵列成员的列表。

$ExchangeMailboxes = Get-Mailbox -ResultSize Unlimited
ForEach ($ExchangeMailbox in $ExchangeMailboxes) {
    Write-host "This is one of the array members" -$ExchangeMailbox
}

PowerShell 输出显示具有 Exchange Online 邮箱的所有成员的列表。

This is one of the array members -Adam Mackay
This is one of the array members -Amanda Hansen
This is one of the array members -Blake Martin
This is one of the array members -Brenda Smith
This is one of the array members -Brian Mill
This is one of the array members -Carl Hawk
This is one of the array members -Carol Piper
This is one of the array members -Chris Lucas
This is one of the array members -Diana Baker
This is one of the array members -Frank Olsen
This is one of the array members -Julia Wood
This is one of the array members -Ken Walker
This is one of the array members -Laura Terry
This is one of the array members -Owen Terry
This is one of the array members -Projector 21
This is one of the array members -RoomMail 8
This is one of the array members -Stephen Hunter
This is one of the array members -Stephen Lambert

指定特定数组成员的身份

使用 PowerShell,我们可以获取数组的每个成员,但现在我们想要指定它们的身份。

要指定数组中每个成员的标识,应使用以下 PowerShell 语法。

$ExchangeMailbox.Identity

变量$ExchangeMailbox 是数组成员,Identity 是对象属性。

Exchange Online 邮箱中有多个对象标识。 Identity 参数指定 Exchange Online 邮箱,您可以使用这些值之一。

  • 姓名
  • 别名
  • 专有名称 (DN)
  • 规范DN
  • 域名\用户名
  • 电子邮件地址
  • GUID
  • 旧版 ExchangeDN
  • Sam 帐户名
  • 用户 ID 或用户主体名称 (UPN)

PowerShell 中的数组成员和类型

您可以在 PowerShell 中使用四种不同类型的关系:

  • 单个用户到另一个用户
  • 单用户到多用户
  • 多个用户到多个用户
  • 多个用户转为单个用户

我们将向您展示其中两个带有 ForEach 语句的示例。

使用 ForEach 从单用户到多用户

在我们的示例中,用户 Ken Walker 是 Exchange Online 管理员。我们想要为所有现有用户邮箱分配完全访问权限。

您需要创建一个由以下部分组成的 PowerShell 脚本:

  1. 首先,您需要定义一个名为$UserMailboxes的变量来获取Exchange Online中的所有用户邮箱。
  2. 然后,您将添加一个名为 $UserMailbox 的附加变量来表示用户邮箱数组中的每个成员。
  3. 最后,您将创建一个 PowerShell 命令来为用户 Ken Walker 分配每个用户邮箱的完全访问权限。要引用数组成员,您需要使用数组的变量,后跟标识,它看起来像$UserMailbox.Identity。通过组合这两部分,您可以在 PowerShell 的 ForEach 循环过程中单独识别每个数组成员。

PowerShell 语法示例。

$UserMailboxes = Get-Mailbox -ResultSize Unlimited -Filter { (RecipientTypeDetails -eq "UserMailbox") }
ForEach ($UserMailbox in $UserMailboxes) {
    Add-MailboxPermission -Identity $UserMailbox.Identity -User "Identity" -AccessRights FullAccess
}

运行以下 PowerShell 脚本。

$UserMailboxes = Get-Mailbox -ResultSize Unlimited -Filter { (RecipientTypeDetails -eq "UserMailbox") }
ForEach ($UserMailbox in $UserMailboxes) {
    Add-MailboxPermission -Identity $UserMailbox.Identity -User "[email protected]" -AccessRights FullAccess
}

它将向用户 Ken Walker 分配所有用户邮箱的完全访问权限。

使用 ForEach 将多个用户转换为单个用户

在我们的示例中,IT 部门的用户希望获得对单个邮箱 ([email protected]) 的完全访问权限。

PowerShell 脚本由以下部分组成:

  1. 在第一部分中,我们定义名为 $ITmembers 的变量来获取 IT 部门的用户。
  2. 然后,您将添加一个名为 $ITmember 的附加变量来表示 IT 数组中的每个成员。
  3. 最后,您将创建一个 PowerShell 命令来为 IT 部门的用户分配对单个邮箱具有完全访问权限的用户。要引用数组成员,您需要使用数组的变量,后跟标识,它看起来像$ITmember.Identity。通过组合这两部分,您可以在 PowerShell 的 ForEach 循环过程中单独识别每个数组成员。

请参阅下面的 PowerShell 语法。

$ITmembers = Get-User -ResultSize Unlimited -Filter 'Department -eq "IT"'
ForEach ($ITmember in $ITMembers) {
    Add-MailboxPermission -Identity "Identity" -User $ITmember.Identity -AccessRights FullAccess
}

运行以下 PowerShell 脚本。

$ITmembers = Get-User -ResultSize Unlimited -Filter 'Department -eq "IT"'
ForEach ($ITmember in $ITMembers) {
    Add-MailboxPermission -Identity "[email protected]" -User $ITmember.Identity -AccessRights FullAccess
}

它将为 IT 部门的每个用户分配对单个 ([email protected]) 邮箱的完全访问权限。

PowerShell ForEach-Object cmdlet

ForEach-Object cmdlet 对输入对象集合中的每个项目执行操作。您需要使用 InputObject 参数并指定输入对象或创建管道作为 cmdlet 的输入。

ForEach-Object PowerShell cmdlet 语法。

Get-Mailbox -ResultSize Unlimited | ForEach-Object {
    #PowerShell command to perform operation on each object
}

有两种不同的方法可以使用 ForEach-Object 命令。

在脚本块中使用 ForEach-Object

您可以使用脚本块来指定要执行的操作。在脚本块中,必须使用$_.variable来表示对象,并在大括号{ }中定义它。

例如,您想要获取所有 Exchange Online 邮箱的 UserPrincipalName

请参阅脚本块中的 ForEach-Object PowerShell 语法。

Get-Mailbox -ResultSize Unlimited | ForEach-Object {$_.UserPrincipalName}

它将显示 Exchange Online 邮箱中所有 UserPrincipalName 的列表。

在操作语句中使用ForEach-Object

也可以写一个操作语句,这样更容易理解。由于没有可供使用的变量,因此您只需向 ForEach-Object cmdlet 提供输入。

在此示例中,我们还将获取所有邮箱的 UserPrincipalName

请参阅操作语句中的 ForEach-Object PowerShell cmdlet 语法。

Get-Mailbox -ResultSize Unlimited | ForEach-Object UserPrincipalName

就是这样!

阅读更多内容:如何在 PowerShell 中使用逻辑运算符 »

结论

您学习了如何在 PowerShell 中使用 ForEach 和 ForEach-Object。使用 ForEach 语句迭代数据集合的速度更快。 ForEach-Object cmdlet 对来自管道的输入对象集合执行操作,使用起来更灵活,但速度较慢。

您喜欢这篇文章吗?您可能还喜欢如何在 PowerShell 中使用比较运算符。不要忘记关注我们并分享这篇文章。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯