2016-11-15 2 views
-2

Мне нужно добавить кучу пользователей через запрос регулярного выражения, который ищет «IM» или «(IM)» в конце своего DisplayName, а затем удаляет его. Я буду экспортировать сначала, конечно, для резервного копирования.PowerShell Regex DisplayName

Я использовал метод .contains, но если я использую это, любой Тим или Имоджен могут немного рассердиться на меня.

$users = Get-DistributionGroupMember 'DGName' | ? { $_.RecipientType -eq 'UserMailbox' } 
$mailboxes = $users | Get-Mailbox 
$output = @() 

$mailboxes | Select-Object Alias, DisplayName | Export-Csv D:\Scripts\PreDisplayNames.csv -NoTypeInformation 

foreach ($mb in $mailboxes){ 
    if ($mb.DisplayName.EndsWith(" (IM)")){ 
     $newString = $mb.DisplayName.TrimEnd(" (IM)") 
     $newStringTD = $mb.DisplayName.TrimEnd(" (IM)") + " (TD)" 
     $resultstring = "Setting DisplayName to $newString" 
     $mb | Set-Mailbox -DisplayName $newString -WhatIf 

    } 
    elseif($mb.DisplayName.EndsWith(" IM")){ 
     $newString = $mb.DisplayName.TrimEnd(" IM") 
     $newStringTD = $mb.DisplayName.TrimEnd(" (IM)") + " (TD)" 
     $resultstring = "Setting DisplayName to $newString" 
     $mb | Set-Mailbox -DisplayName $newString -WhatIf 
    } 
    else{ 
     $newString = 'DNIncorrect' 
     $resultstring = 'Incorrect DisplayName' 
    } 
    $props = [ordered]@{ 
      'DisplayName' = $mb.DisplayName 
      'NewDisplayName' = $newString 
      'NewDisplayName TD' = $newStringTD 
      } 
    $object = New-Object -TypeName PSObject -Property $props 
    $output += $object 
} 

$output | Export-Csv "D:\scripts\DisplayNames.csv" -NoTypeInformation 
+0

проблема возникает приклеивание кода, но, возможно, ответили. '$ newString = $ string.DisplayName.TrimEnd (" (IM) ")' ... так ЕСЛИ через любую итерацию, а затем еще одну, чтобы позаботиться о том, что не соответствует этому соглашению (это большая среда) – Toybits

+0

ВНИМАНИЕ: '.trim()' удаляет ВСЕ подходящие символы! Поэтому даже 'MI' будет удален! – restless1987

+0

Ahh .... так вот почему я разместил ... ура беспокоит1987. вы бы предложили лучший способ? – Toybits

ответ

0

Там нет необходимости в регулярном выражении здесь, просто использовать -как для фильтрации объектов, когда вы собираете почтовые ящики

$mailboxes = $users | Get-Mailbox | Where-object {($_.DisplayName -like "*IM") -or ($_.DisplayName -like "*(IM)")}

+0

Спасибо, Майк. Да, меня просто беспокоили все, что не соответствует конвенции, так как это большая вероятность. Предположим, что вероятность несоблюдения следующего соглашения И с именем, заканчивающимся в IM, очень маловероятна, поэтому вы, вероятно, правы – Toybits

+0

Можете ли вы быть уверены, что IM или (IM) всегда будут заглавными буквами, если так использовать - clike, а не-like, что должно устранить большое количество ваших ложных срабатываний. Также вы упоминаете соглашение, но я не думаю, что вижу его в исходном вопросе, если вы можете показать мне, как он должен выглядеть, как я могу попробовать ставить r regex для вас, что позволит вам игнорировать вещи, которые не соответствуют (или генерировать отчет о несоответствующих именах, которые также имеют IM в них для просмотра вручную) –

+0

Cheers again Mike. Я даже не знал о clike, мне действительно нужно использовать get-help больше. По соглашению я имею в виду, что они должны заканчиваться в IM или (IM), но хотели бы быть уверены, в случае, если некоторые из них не будут, поскольку я нацелен на группу. Я думаю, что вы написали раньше, и, как вы говорите, используйте clike вместо того, чтобы собираться делать трюк. – Toybits

0

Если вы все еще хотел регулярное выражение, я обычно использую следующее сгенерируйте регулярное выражение для определенных слов. Это может сработать для вас.

$Eliminate = @("bak", "error", "research","Retry") 
[regex]$eliminate_regex = '(?i)(' + (($Eliminate | foreach { [regex]::escape($_) }) -join "|") + ')'