【问题标题】:Union and Intersection in PowerShell?PowerShell中的联合和交集?
【发布时间】:2012-01-26 09:49:08
【问题描述】:

我有一个具有以下结构的对象数组:

structure Disk
{
  int UID;
  String Computer;
}

一台电脑可能有一堆共享磁盘,一个磁盘可能在电脑之间共享。

我想找出所有计算机共有的所有磁盘。比如我有电脑A、B、C;磁盘 1、2 和 3。 磁盘阵列为 {1,A}, {1,B}, {2,A},{2,B},{2,C},{3,A}。 我想要的结果应该是磁盘 2,因为它出现在 A、B 和 C 上。

有没有有效的方法来实现这一点?

使用多个 foreach 循环是可以实现的,但我绝对想要一个更好的方法。我正在考虑像交集这样的操作,但在 PowerShell 中没有找到。

【问题讨论】:

  • 我建议将标题更改为“PowerShell 中的联合、交集和差异/设置减法”。因此,我们将在一个地方完成所有设置操作。
  • 基于这里的问题和建议,我创建了一个 PowerShell 函数来对对象进行 Union、Intersection 和 Minus。看看:sqljana.wordpress.com/2015/09/23/…

标签: arrays powershell


【解决方案1】:

假设$arr 是数组,你可以这样做:

$computers = $arr | select -expand computer -unique
$arr | group uid | ?{$_.count -eq $computers.count} | select name

一般来说,我会像这样在 Powershell 中处理联合和交集:

$a = (1,2,3,4)
$b = (1,3,4,5)
$a + $b | select -uniq    #union
$a | ?{$b -contains $_}   #intersection

但是对于您要问的问题,上述解决方案效果很好,而不是关于术语标准定义中的并集和交集。

更新:

我写了pslinq,它提供了Union-ListIntersect-List,这有助于实现与Powershell的集合并集。

【讨论】:

  • 很酷的东西,这些 oneliners 将如何处理像 Hashtables 这样的键控集合?
  • 很棒的帖子——应该有一个提供类似功能的数组标准库。 lodash for powershell..
  • 为了完整起见,您可以使用 $a | 获得 $a 和 $b 之间的设置差异。 ?{$b -notcontains $_} #差异
  • 有谁能给我一个 technet 的链接,告诉我 ?{...} 结构的定义和/或示例
  • ?是 Where-Object 的别名,所以 ? {} --> Where-Object -FilterScript {...}
【解决方案2】:

你也可以这样做

$a = (1,2,3,4)
$b = (1,3,4,5)
Compare-Object $a $b -PassThru -IncludeEqual                   # union
Compare-Object $a $b -PassThru -IncludeEqual -ExcludeDifferent # intersection

如果$a 为空则不起作用。

【讨论】:

  • 可以将 $null 添加到数组中。 $a = 1,2,3,4,$null
【解决方案3】:

对于集合减法(a - b):

$a | ?{-not ($b -contains $_)}

【讨论】:

  • 还有-notcontains。
  • Narthan 节省了人们的时间,下次写出来 :) $a | ?{$b -notcontains $_}
【解决方案4】:

虽然这在最早的版本中不起作用,但在较新的版本中,您可以直接调用 .NET LINQ 扩展函数,例如

[system.linq.enumerable]::union([object[]](1,2,3),[object[]](2,3,4))

(如果不强制转换为某些可枚举类型,PowerShell 会抛出“找不到重载”错误。)

这在 PowerShell V4 和 V5 中绝对有效,而在 V2 中绝对无效。我手头没有 V3 系统。

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2016-02-22
    相关资源
    最近更新 更多