首页 > 解决方案 > 如何限制 ForEach 运行的次数

问题描述

我正在尝试使用 CSV 文件删除 Exchange 联系人,但是,如果该列表超过 25 个用户,我希望此脚本停止,甚至永远不会启动。

$RemoveContacts = Import_CSV ".\Removed Contacts_$((Get-Date).ToString('MMddyyyy')).csv"
$RemoveContacts | ForEach { Remove-MailContact -identity $_ -confirm:$false}

实现这一目标的最佳方法是什么?

标签: powershellforeachbreak

解决方案


如果数组有超过 25 个用户,您甚至不想开始处理:$RemoveContacts

if ($RemoveContacts.Count -gt 25) {
  Write-Error "Too many contacts: $($RemoveContacts.Count)"
  return
}

Write-Error创建一个非终止错误并return退出脚本/函数。请注意,如果适用,默认情况下会继续处理。
要中止处理,请使用Throw而不是Write-Error.


如果您最多要处理 25 个元素

Select-Object -First <n><n>允许您在收到第一个对象后停止处理:

$RemoveContacts | Select-Object -First 25 | ForEach { Remove-MailContact -identity $_ -confirm:$false }

Select-Object -First是在管道中使用的正确工具。

但是,由于您已经将所有对象加载到内存中的数组中,您可以更简单且更有效地使用数组切片

$RemoveContacts[0..24] | ForEach { Remove-MailContact -identity $_ -confirm:$false }

[0..24]从 array 中提取前 25 个元素$RemoveContacts,即使数组包含的元素少于此,也可以安全使用。[1]

在 PSv4+ 中,您可以通过使用处理每个数组元素的.ForEach() 方法来进一步加快速度:

$RemoveContacts[0..24].ForEach({ Remove-MailContact -identity $_ -confirm:$false })

[1] 除非你刻意激活或更高。Set-StrictMode -Version 3


推荐阅读