【问题标题】:Powershell compare variable1 with variable2Powershell 比较变量 1 和变量 2
【发布时间】:2020-02-15 03:28:00
【问题描述】:

我正在尝试以下方法:

Variable1 = 'jack' , 'brody' , 'zack'
Variable2 = 'zack'

variable1 和 variable2 中的每个值都具有以下属性。

jack.username
jack.mail
jack.ou

我想比较变量 1 和变量 2,只返回变量 2 中不存在的用户并将结果保存到新变量 3。

“示例 jack 和 brody 将返回给变量 3,但不会返回 zack,因为他同时出现在变量 1 和 2 中。”

返回后,我还希望用户名、邮件和 ou 在变量 3 中可用。

我尝试了以下方法:

$variable3 = $Variable1.SamAccountName | Where {$variable2.SamAccountName - 
NotContains $_}
$variable3 = Compare-Object -ReferenceObject $variable1 -DifferenceObject
$variable2 -ExcludeDifferent 

(如果使用 excludediff,第二个不返回任何内容)。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以使用以下内容:

    $variable3 = Compare-Object -ReferenceObject $variable1 -DifferenceObject $variable2 -Property SamAccountName -PassThru
    

    使用Compare-Object 时,-Property 参数允许您指定要比较的属性值,而不是比较整个对象。

    -PassThru 开关以原始形式返回所有对象,其中包括您想要的所有属性。

    虽然这里没有使用,但-ExcludeDifferent 开关如果不与-IncludeEqual 一起使用,则不会返回任何内容,因为默认情况下,Compare-Object 返回差异。


    或者,您可以使用comparison operators1 和Where-Object 的组合。由于-contains 和-in 运算符变体可以支持集合和单个对象比较,我个人会使用那些支持单一比较运算符(如-eq 或-like)来确保更强大的解决方案。

    $variable3 = $variable1 | Where {$_.SamAccountName -notin $variable2.SamAccountName}
    

    管道左侧的对象| 包含处理Where-Object 后将返回的属性。所以如果你使用$variable1.SamAccountName | Where,你只会返回SamAccountName的值。


    [1]:请注意,运算符 -notin 和 -in 是在 PowerShell v3 中添加的。如果您运行的是 PowerShell v2,它们将不可用。

    【讨论】:

    • 很遗憾,当您使用 -ExcludeDifferent 时,-IncludeEqual 没有暗示 - 让我们尝试改变它:GitHub issue。
    • 另外值得一提的是,Where-Object 方法通常比较慢:对于相同长度的集合,它是 O(N^2);不幸的是,Compare-Object 似乎也是如此,因为相对性能不会随元素数量而变化。从数千个元素开始计数时,两者都表现不佳。对于只有一些差异的相同大小的集合,我看到Where-Object 需要 3.5 到 4 倍的时间,但如果你只需要哪些 A 元素不在 B 中,而不需要相反的元素,那么它会减半,@ 987654349@也总是确定。
    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多