查找哪些值不属于另一个数组PowerShell的数组元素

时间:2018-02-19 09:14:35

标签: windows powershell

我有两个数组

  • $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,但没有输出。

2 个答案:

答案 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