我有2个数组$UsersGroup和$UsersActive,我需要找到$UsersActive中包含SamAccountName和ObjectGUID的行的位置。
$用户组=
SamAccountName ObjectGUID
-------------- ----------
XXXX00XX 0031e949-9120-4df1-bddb-98067a141448
XXXX01XX 0031e949-9120-4df1-bdgb-99067a141448
XXXX02XX 0031e949-9120-4df1-bdab-97067a141448
并且没有标头
$活动用户=
fcb483fa146b
fcb515739a2f
fcb82f1ef74c
fcc5ee8b8722
fcd3f1f471c2
fceb26a598a3
fd0b14cecd0e
98067a141448
我需要将用户从$UsersActive匹配到$UserGroup.Object,就像这样
$UsersGroup | ForEach-Object {if($_.ObjectGUID -contains $UsersActive) {$_}}
但我没有得到这样的结果:
谁能帮帮我,谢谢!
3条答案
按热度按时间ercv8c1e1#
-contains
是一个 * 集合包含 * 运算符,用于测试右侧参数是否在左侧参数中准确出现。要测试字符串中是否存在子字符串,请使用
-like
通配符字符串比较运算符:现在,将针对每个
$UsersActive
值测试每个组条目,直到找到匹配项(使Where-Object
传递对象)或找不到匹配项(使Where-Object
过滤掉对象)6rqinv9w2#
如果我没理解错的话,使用compare-object......它只有一个匹配项。对于大型列表,Compare-object可能会很慢。
pcww981p3#
提供替代解决方案:
如Mathias在his answer中所述,
-contains
运算符及其反向运算符-in
只执行单个比较值与集合(数组)元素的 * 相等 * 比较。$_.ObjectGUID
是标量(单个对象),$UsersActive
是要搜索的集合(数组),那么您需要使用-in
,而不是-contains
($_.ObjectGUID -in $UsersActive
)不幸的是,从7.3.2版开始,PowerShell的 * 模式匹配 * 运算符
-like
(使用wildcard expressions)和-match
(使用regexes)* 不 * 支持针对 * 多个 *(数组)模式进行匹配。但是,由于您希望匹配每个
.ObjectGUID
值的一个 * literal substring *,因此如果您首先提取相关的子字符串并使用 * it * 作为比较值,则 * 可以 * 使用-in
:请注意
-split
operator是如何用于将GUID拆分为-
标记的,[-1]
返回 * last * 标记,然后-in
通过相等比较在$UsersActive
数组中查找该标记。顺便说一句:
-like
和-match
的RHS--以便在它们中的 * 任何 * 匹配时返回$true
--将是一个有益的未来改进。