查看并使用 Windows PowerShell 脚本中的 ForEach 循环
执行管道时,管道中的命令会应用于每个对象。 在某些情况下,可能需要使用 ForEach-Object cmdlet 来处理管道中的数据。 将数据存储在数组中时,ForEach 构造支持处理数组中的每个项。
ForEach 构造使用以下语法:
ForEach ($user in $users) {
Set-ADUser $user -Department "Marketing"
}
在前面的示例中,有一个名为 $users 的数组,其中包含 Active Directory 域服务 (AD DS) 用户对象。 ForEach 构造会为每个对象处理一次大括号之间的 Windows PowerShell 命令。 处理命令时,$user 是包含数组中每个项的变量。 在第一次迭代中,$user 包含 $users[0],在第二次迭代中,$user 包含 $user[1]。 这会一直持续到数组中的所有项都已处理一次。
在脚本中,ForEach 构造是处理已放入数组的项的最常用方法。 它易于使用,因为无需了解项数即可进行处理。
前面的示例在大括号之间仅有一个命令,但可以添加许多命令,这些命令将针对每个循环进行处理。 按照约定,大括号之间的命令缩进是为了使脚本更易于查看。 缩进不是技术要求,但却是一种很好的做法。
ForEach 循环中的变量命名应是有意义的。 大多数时候,将循环中使用的变量清楚地识别为数组的单个实例。 例如,对于名为 $users 的数组,循环中使用的变量可能是 $user。 你可能会注意到带有单个字母的变量示例,该字母与数组的首字母相同。 但是,这应该仅用在简单的代码中,其中很容易判断它们是相关的。
并行性能
在 PowerShell 7 中,已将 -Parallel 参数添加到 ForEach-Object cmdlet。 这样,管道就可以同时处理多个对象。 相较于标准 ForEach 循环,同时处理多个对象所提供的性能更佳。 如果使用的是 PowerShell 7,应考虑这一点。 以下示例说明了如何将 ForEach-Object 与 -Parallel 参数配合使用。
$users | ForEach-Object -Parallel { Set-ADUser $user -Department "Marketing" }
默认情况下,-Parallel 参数支持一次处理五个项。 可以使用 -ThrottleLimit 参数将其修改为更大或更小的值。