Как ограничить количество запусков ForEach - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь удалить контакты Exchange с помощью файла CSV, однако я хочу, чтобы этот сценарий остановился или даже не запустился, если этот список превышает 25 пользователей.

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

Каков наилучший способдостичь этого?

1 Ответ

0 голосов
/ 03 октября 2018

Если вы даже не хотите запускать обработка , если массив $RemoveContacts имеет более 25 пользователей:

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] извлекает первые 25 элементов из массива $RemoveContacts и безопасен в использовании, даже если массив содержит меньше элементов.

В PSv4 + вы можете еще больше ускорить этоиспользуя .ForEach() метод для обработки каждого элемента массива:

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