使用 Where-Object 时可能包含空格的匹配字符串

Matching string which might contain whitespace when using Where-Object

我需要一个 PowerShell 脚本来检查特定用户是否属于特定组以及用户是否属于任何这些组。

但是,它不能正常工作。我假设存在关于 $_ -match 'CN=IT Tool ((TST) Users|(PROD) Users)' 的问题,下面的安全组也有空格。

最后,我想通过 Export-CSV 获得输出。

有两组:

IT Tool (TST) Users
IT Tool (PROD) Users

脚本:

$csv = import-csv "c:\tmp\lists.csv"


foreach ($v in $csv) {
    $userinput = $v.userinput
Get-ADUser -Identity $userinput -Properties EmailAddress, MemberOf | ForEach-Object {
    $testgroups = $_.MemberOf | Where-Object { $_ -match 'CN=IT Tool ((TST) Users|(PROD) Users)' }  
    if ($testgroups) {
        # the user is a member of group IT_Test and/or IT_Prod, get the names of these groups for this user
        $groups = foreach ($grp in $testgroups) { (Get-ADGroup -Identity $grp).Name }
        $_ | Select-Object Name, SamAccountName, @{Name = 'MemberOf'; Expression = {$groups -join ', '}}
    }
    else {
        # the user is not a member of any IT_Group
        $_ | Select-Object Name, SamAccountName, @{Name = 'MemberOf'; Expression = {'Not a member of any Group'}}
    }
}

}

您需要转义组名称中的任何文字 (),否则这些字符将被解释为分组结构:

$testgroups = $_.MemberOf | Where-Object { $_ -match 'CN=IT Tool (\(TST\) Users|\(PROD\) Users)' }

由于 TST/PROD 部分是两个可能的组名之间唯一不同的部分,您可以进一步简化模式:

$testgroups = $_.MemberOf | Where-Object { $_ -match 'CN=IT Tool \((TST|PROD)\) Users)' }

要将结果导出到 CSV,只需将循环的输出收集到一个变量,然后将变量内容通过管道传输到 Export-Csv:

$results = foreach($v in $csv) {
  # ...
}

$results |Export-Csv -Path path\to\output.csv -NoTypeInformation