我正在尝试匹配只有一个下划线的字符串。 Match 当前正在查找 lastname_firstname 和 lastname_firstname_middleinitail。我只想返回 lastname_firstname 并排除其他所有内容。
我试过了
-match "._." ".(_)." "._{1}" -like "*_*"
有同样的问题
这是我的代码中有 -match 的部分
$newUsers = Get-ADUser -SearchBase "CN=Users,DC=atlantic,DC=county" -Filter {WhenCreated -ge $date7DaysAgo} | Where-Object {$_.name -match "._."}
我建议您使用 LDAP 执行部分过滤以减少数据集,使您的代码更有效率。
(name=*_*)
只会搜索 name
属性至少包含一个 _
的用户,排除那些没有下划线的用户。对于第二层过滤,'^[a-z]+_[a-z]+$'
将确保名称只有一个_
。请参阅此处的示例:https://regex101.com/r/4l1O9Y/1.
$daysAgo = [datetime]::UtcNow.AddDays(-7).ToString('yyyyMMddHHmmss.0Z')
$getADUserSplat = @{
SearchBase = 'CN=Users,DC=atlantic,DC=county'
LDAPFilter = "(&(WhenCreated>=$daysAgo)(name=*_*))"
}
$newUsers = Get-ADUser @getADUserSplat |
Where-Object { $_.Name -match '^[a-z]+_[a-z]+$' }
Where-Object {$_.name -match "_.*?_"}
将检查输入字符串中是否有 2 个或更多下划线,但您想要相反的结果。因此,您可以使用 NOT 运算符反转 $_.name -match "_.*?_"
的输出:
Where-Object { !($_.name -match "_.*?_") }