我正在尝试仅隔离组名。
执行以下命令:
Get-ADUser aaa00 -Properties memberof |
Select-Object -ExpandProperty memberof
返回:
CN=GroupName,OU=xxx,OU=xxx,DC=xxx,DC=xxx,DC=xxx
我只想要CN=
之后的名称,即组名。
所以我在做:
Get-ADUser aaa00 -Properties memberof |
Select-Object -ExpandProperty memberof |
ForEach-Object {
$isolateName = $_ -match "(?<=\=)(.*?)(?=\,)"
$matches[0]
}
有效并且仅返回组名。
但是,我想将组名存储在数组中以备后用,所以我在做:
Get-ADUser aaa00 -Properties memberof |
Select-Object -ExpandProperty memberof |
ForEach-Object {
$isolateName = $_ -match "(?<=\=)(.*?)(?=\,)"
[array]$Names += $matches[0]
}
这很好。
我的问题是,使用RegEx的最佳方法是吗?
我先做-match
,然后再检查$matches
,但我不能只做倒转,而是做“用正则表达式匹配的内容全部替换掉”。
我该怎么做,基本上否定了整个正则表达式?
P.S .:我知道我可以使用Get-ADPrincipalGroupMembership
仅获取名称,但是我不使用该命令,因为与Get-ADUser
相比,它的运行速度非常慢。
答案 0 :(得分:3)
尝试以下操作,该操作使用-replace
运算符提取组名:
$groupNames = Get-AdUser gar25 -properties memberof |
Select-Object -ExpandProperty memberof |
ForEach-Object { $_ -replace '^CN=(.+?),.*', '$1' }
注意:假设组名不包含转义的 ,
字符。 (\,
。
仅通过将整个管道分配给变量$groupNames
即可隐式创建组名数组。 (如果有可能仅返回 1 组,并且您要确保结果为 array ,请将整个管道括在@(...)
中,数组子表达式运算符。
$_ -replace '^CN=(.+?),.*', '$1'
从每个输入中提取组名:
^CN=
在输入字符串的开头(CN=
)与文字^
匹配。(.+?)
非贪婪(?
)匹配任意字符(.+
)的非空游程,并使用捕获组((...)
)捕获该游程。 ,.*
与文字,
匹配,后跟(贪婪匹配)可能为空的任意字符(.*
),即,它与其余输入匹配。,
字符(假定为组名)之前的所有内容。$1
-第一个捕获组捕获的内容-作为替换操作数,它只是返回的组名。