我想计算具有相同姓氏和电子邮件的用户帐户。问题在于表示那些属性的字符串可以包含数字。 在AD中可以存在,例如,
数字仅用于使帐户和邮件地址唯一。 搜索Anne Smith将列出第一和第二位置。
现在我有一段代码可以做到这一点。
$Inni = Get-ADUser -Filter "(sn -like '$($UserWzor.Surname)*') -and (GivenName -eq '$($UserWzor.GivenName)')" -Server $DC -Properties sAMAccountName, sn, givenName, displayName, mail | Where-Object -FilterScript { $_.sAMAccountName -ne $UserAD.sAMAccountName } | Select-Object -Property sAMAccountName, sn, givenName, displayName, mail
$IluInnych1 = 0
$IluInnych2 = 0
foreach ($Inny in $Inni) {
$InnyNazwisko = $Inny.sn -replace '[ ]\d+$'
$InnyImie = $Inny.GivenName
if (($InnyNazwisko -eq $UserWzor.Surname) -and ($InnyImie -eq $UserWzor.GivenName)) { $IluInnych1++ }
$InnyMail = [regex]::replace(($Inny.mail).Split("@")[0], '\d+$', "")
if ($InnyMail -eq $NowyMail){ $IluInnych2++ }
}
我不需要知道其他Anne Smith数据,而只需要知道它们的编号,因此我可以通过向其DisplayName和mail属性添加下一个未占用的编号来重命名帐户。
由于-Filter
选项不允许使用正则表达式,因此我尝试将其放入查询的Where-Object
部分,甚至在ForEach-Object
和{之间循环Get-AdUser
{1}},但没有成功。
Where-Object
此查询的结果为空。
是否有可能比显示的方法更简单?
答案 0 :(得分:0)
您可以使用以下正则表达式:
[\w]*? ([\w]*).*?, ([\w\d@.]*)
对于第1组和第2组相同的人,需要入围。
演示:https://regex101.com/r/RiOCf5/1
测试:
Anne Smith, anne.smith@mail.pl
Anne Smith 23, anne.smith23@mail.pl
Anne Smithy, anne.smithy@mail.pl
匹配:
Match 1
Group 1. 5-10 `Smith`
Group 2. 12-30 `anne.smith@mail.pl`
Match 2
Group 1. 36-41 `Smith`
Group 2. 46-66 `anne.smith23@mail.pl`
Match 3
Group 1. 72-78 `Smithy`
Group 2. 80-99 `anne.smithy@mail.pl`
Powershell中的结果:
[regex]::Match('Anne Smith, anne.smith@mail.pl','[\w]*? ([\w]*).*?, ([\w\d@.]*)').captures.groups[1].value
[regex]::Match('Anne Smith 23, anne.smith23@mail.pl','[\w]*? ([\w]*).*?, ([\w\d@.]*)').captures.groups[1].value
[regex]::Match('Anne Smithy, anne.smithy@mail.pl','[\w]*? ([\w]*).*?, ([\w\d@.]*)').captures.groups[1].value
输出:
Smith
Smith
Smithy