我有两个数组
$adg
- (AD群组列表)
$dbs
- (数据库名称列表)
假设我使用此命令
$adg -match $dbs.i
输出将是名称中包含字符串$dbs
的所有AD组。
但是,我的目标是找到不属于AD组数组的DB。
例如:
$adg = @("Dev22_Owner","Test49_Owner","Rocket_Owner")
$dbs = @("Dev22", "Confidential", "InternDB", "Rocket", "Test49")
我应该采取什么方法来获得输出:
Confidential
InternDB
我尝试$dbs | Where $adg -notmatch $dbs.i
,但没有输出。
答案 0 :(得分:1)
我会首先从广告组中删除不必要的用户部分:
$groups = $adg | ForEach-Object {
$_ -replace '_.*?$'
}
然后,您可以将Where-Object
cmdlet与-notin
运算符一起使用来过滤它们:
$dbs | Where-Object { $_ -notin $groups }
<强>输出:强>
Confidential
InternDB
答案 1 :(得分:1)
为Martin Brandl's helpful answer提供更简洁的PSv3 +替代方案:
PS> (Compare-Object ($adg -replace '_Owner$') $dbs).InputObject
Confidential
InternDB
($adg -replace '_Owner$')
返回一个新数组,其中包含从中删除_Owner
后缀的输入字符串副本。
Compare-Object
将剥离的数组与另一个数组进行比较,并返回表示两个数组之间差异的对象。
访问差异对象上的.InputObject
会返回不同的值。
$dbs
包含不在已剥离的$adg
数组中的项目,则上述内容将返回所有不同项目的联合,无论他们在哪一方'独一无二;要区分边/限制,您必须使用.SideIndicator
属性(值=>
表示右侧侧独有的值,<=
那些专属于左方面。至于您尝试的内容:
$adg -match $dbs.i
无法按预期工作,并且与$adg -match ''
实际上相同,后者总是会返回所有 $adg
个项目。
原因是数组$dbs
没有.i
属性,因此表达式的计算结果为$null
,在匹配的RHS上强制转换为字符串因此转换为空字符串。
通常, -match
的RHS确实不支持数组 - 只有单个正则表达式。
如果提供数组,则通过连接元素将其隐式转换为字符串,以形成以空格分隔的列表;例如数组1, 2
被强制转移到'1 2'
和'1 2' -match (1, 2)
,因此评估为$True
。