powershell - 匹配字符串,如果它有一个特定的字符。 I.E lastname_firstname 不匹配 lastname_firstname_middleinitail

问题描述 投票:0回答:2

我正在尝试匹配只有一个下划线的字符串。 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 "._."}
regex powershell active-directory match
2个回答
1
投票

我建议您使用 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]+$' }

0
投票

Where-Object {$_.name -match "_.*?_"}
将检查输入字符串中是否有 2 个或更多下划线,但您想要相反的结果。因此,您可以使用 NOT 运算符反转
$_.name -match "_.*?_"
的输出:

Where-Object { !($_.name -match "_.*?_") }
© www.soinside.com 2019 - 2024. All rights reserved.