Вывод списка групп рассылки только при наличии адреса smtp

Я пытаюсь перечислить все группы, которые содержат определенный SMTP-адрес в группе. Ниже приведен код, который я использую, но он выводит все, а не только группы с указанным SMTP-адресом:

$temp = Get-DistributionGroup -ResultSize Unlimited 
foreach ($group in $temp) 
{ 
  if (Get-DistributionGroupMember $group | select -ExpandProperty PrimarySmtpAddress`
   | ForEach-Object {$_.PrimarySmtpAddress -match "contoso.com"}) {

    Write-Output "GroupName:$group " 
    Write-Output "GroupName:$($group.PrimarySmtpAddress) "
    Write-Output "GroupMembers:" 
    Get-DistributionGroupMember $group|ft displayname,primarysmtpaddress
  }
  else 
  {
    Write-Host "null"
  }
}

1 ответ

Решение

Это не сработает, потому что ваш оператор if просто проверяет, успешно ли выполняется код в условии, и нет никаких причин, по которым он потерпит неудачу для любой группы. В логике нет ничего, что делает условие ложным, если блок Foreach-Object не находит совпадений. Попробуй это:

foreach ($group in $temp) {
  if ((Get-DistributionGroupMember $group | %{$_.PrimarySmtpAddress}) -match 'contoso\.com') {
    [...]

(Get-DistributionGroupMember $group | %{$_.PrimarySmtpAddress}) создает массив свойств PrimarySmtpAddress всех членов, а затем условие if проверяет, соответствует ли оно регулярному выражению (-match, примененный к массиву, возвращает массив всех совпадающих элементов, так что это правда, если хотя бы один элемент соответствует, ложь, если массив пуст)

Обратите внимание, что строка справа от оператора -match является регулярным выражением, а не литеральной строкой. Вот почему я добавил обратную косую черту. В регулярном выражении . соответствует любому отдельному символу, поэтому -match 'contoso.com' будет соответствовать строки как contososcom а также contoso?com,

Другие вопросы по тегам