Не удается отфильтровать имя пользователя с помощью шаблона Array of Strings? - PullRequest
0 голосов
/ 30 апреля 2020

Я не могу преобразовать приведенную ниже длинную строку шаблона отображаемого имени в массив строк в приведенном ниже Powershell:

Цель состоит в том, чтобы иметь возможность отображать пользователя без указания c шаблонов строк.

$startsWith = @(
    'Test'
    'Sync_'
    'admin'
)

$endsWith = @(
    '365'
    '\$'
    'svc'
    'Sync'
    'user'
)

$uPNpattern = '^({0})|({1})$' -f $($startsWith -join '|'), $($endsWith -join '|')

$dnPattern = @(
    'Admin'
    'Calendar'
    'Room'
    'Prod'
    'Account'
    'Fax'
    'Team'
    'Office'
    'Test'
    'User'
    'insp'
)

$displayNamePattern = '^({0})|({1})$' -f $($dnPattern -join '|')

# Member Outputs for Microsoft.Online.Administration.User based on https://docs.microsoft.com/en-us/powershell/module/msonline/get-msoluser?view=azureadps-1.0
$allUsers = @()
$allUsers = Get-MsolUser -All -EnabledFilter EnabledOnly | Where-Object {
        ($_.UserPrincipalName -notmatch $uPNpattern) -and
        ($_.UserPrincipalName -notlike '*#EXT#*') -and
        ($_.DisplayName -notmatch $displayNamePattern)
} | Select-Object FirstName, 
        LastName, 
    UserPrincipalName,
    @{Label = 'SMTP Address(es)'; 
        Expression = { 
            If (( $_.UserPrincipalName -match 'onmicrosoft.com$')) {
              ($_.proxyAddresses | Where-Object { ($_ -like 'SMTP*') -and ($_ -like '*onmicrosoft.com') }) -replace 'smtp:' -join ';'
            } Else {
                ($_.proxyAddresses | Where-Object { ($_ -like 'SMTP*') -and ($_ -notlike '*onmicrosoft.com') }) -replace 'smtp:' -join ';'
            }
        } 
    },
    AlternateEmailAddresses, 
    UsageLocation, 
    isLicensed,
    Licenses,
    @{Label = 'License(s)'; 
        Expression = {
            ($_.Licenses | ForEach-Object { ($_.AccountSkuId | Where-Object { $_.AccountSkuId -like 'Company1Ltd*' }) -replace 'Company1Ltd:' } ) -join ';'
        }
    },
    PasswordNeverExpires, 
    BlockCredential

$allUsers | Out-GridView -Title "$(($allUsers).Count.ToString()) user accounts in total"

Код ошибки:

Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list..
At line:102 char:44
+ $displayNamePattern = '^({0})|({1})$' -f $($dnPattern -join '|')
+                                            ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (^({0})|({1})$:String) [], RuntimeException
    + FullyQualifiedErrorId : FormatError

Однако, если секция фильтрации изменилась на эту длинную строку, она работает:

($_.DisplayName -notmatch 'Admin|Calendar|Room|Prod|Account|Fax|Team|Office|Test|User')

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Только -соединение здесь достаточно:

$displayNamePattern = $dnPattern -join '|'
1 голос
/ 05 мая 2020

Вы можете использовать строку выбора со списком шаблонов.

$list = echo ^one two three$

echo one | where { $_ | select-string -notmatch $list } 

echo four | where { $_ | select-string -notmatch $list }
four

Или

echo four | where { select-string -notmatch $list -inputobject $_ }
four
...