[玩转系统] 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 只能在管道之后使用。
下表显示了 ForEach 和 ForEach-Object 之间的差异。
Beginning of a command line一条管道后
Fast慢的
读完本文后,您应该知道如何在 PowerShell 中使用 ForEach 和 ForEach-Object。如果您已经有一个数组,请使用 ForEach 语句。如果您有管道输入并想要导出结果,请使用 ForEach-Object。
PowerShell Foreach 语句
ForEach 语句用于迭代数据集合,例如项目、邮箱或用户的列表。
如何在 PowerShell 中创建数组
数组是对象(成员)的集合。通常,您使用数组来分组或绑定一个或多个对象。当您使用ForEach语句时,它将引用数组中的每个成员。
数组对象的一些示例:
- 用户
- 在线交换邮箱
- 文件中的一行
- 操作系统进程
数组可以是特定对象或特定对象的子集。例如,所有的Exchange Online邮箱都是一个数组,它是一个特定的对象。如果您只需要用户邮箱,它们也可以是一个数组,它是 Exchange Online 邮箱的子集。
您可以使用不同的方法来创建数组:
- 使用基本的 PowerShell 命令并使用数组。例如,每个以 Get 开头的 PowerShell cmdlet。
- 特定格式的信息数据(例如 CSV 文件)也可以是数组。当您打开 CSV 文件时,它具有行和列,其中每个行代表一个成员数组。每列代表一个成员属性。
- 使用组实际上是一个数组。组充当包含组成员的逻辑容器,它是一个数组。
- 如果您手动编写以逗号字符分隔的每个成员,您还会创建一个多个用户的数组。
使用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 对象
数组是对象的集合,例如所有用户或成员。该阵列中的每个用户都是阵列成员。
我们将向您展示两种显示数组成员的方法。
方法一:查看特定数组成员
在我们的示例中,变量 $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 脚本:
- 首先,您需要定义一个名为$UserMailboxes的变量来获取Exchange Online中的所有用户邮箱。
- 然后,您将添加一个名为 $UserMailbox 的附加变量来表示用户邮箱数组中的每个成员。
- 最后,您将创建一个 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 脚本由以下部分组成:
- 在第一部分中,我们定义名为 $ITmembers 的变量来获取 IT 部门的用户。
- 然后,您将添加一个名为 $ITmember 的附加变量来表示 IT 数组中的每个成员。
- 最后,您将创建一个 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 中使用比较运算符。不要忘记关注我们并分享这篇文章。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag