比较 $null 数组的 Compare-Object

9

有没有一种方法,使 Compare-Object cmdlet 能预测 $Null 值?

例如,当我尝试像这样比较 2 个值时:

Compare-Object -ReferenceObject $Value1 -DifferenceObject $Value2 

我常常遇到以下错误:
Cannot bind argument to parameter 'ReferenceObject' because it is null

我的问题是:是否有一种方法可以说:如果它们中的任何一个等于$ null,则执行某些操作。

转载另一个答案: http://stackoverflow.com/questions/13504346/powershell-compare-object-on-empty-folder - Craig - MSFT
5个回答

20

这个接受null值:

Compare-Object -ReferenceObject @($Value1 | Select-Object) -DifferenceObject @($Value2 | Select-Object)

2
这对我所寻找的东西非常有效。我正在从AD导入,但如果数组为空,我会出错。如果情况如此,我想得到对象与object2(null)不同的结果。这可以在不必为对象编写评估用例的情况下以简单的方式完成。 - Jeremy
我注意到在我的测试中,管道符号到 Select-Object 是不必要的。您能解释一下为什么在您的答案中使用它吗? - codaamok
1
@($null).Count 1@($null | Select-Object).Count 0 - Aaron
谢谢您的回答。您能解释一下为什么这个方法可行吗?是因为Select-Object总是返回一个对象,而例如get-content则返回字节字符串吗? - Bram

5

关于Compare-object的帮助信息如下:

如果参考集或差异集为null ($null),Compare-Object会生成终止错误。

因此,你的唯一选择似乎是使用陷阱或try/catch语句。


1
这段代码与空值有关:
if ($Value1 -ne $null -and $Value2 -ne $null) {
    Compare-Object -ReferenceObject $Value1 -DifferenceObject $Value2
}
else {
    #do something
}

1
 if($Value1 -eq $NULL){
     return
 }
 Compare-Object -ReferenceObject $Value1 -DifferenceObject $Value2 

1
如果您能解释一下,那么这将是一个更有力的答案。 - Eric J.
这只是尝试/捕获的替代方法。如果第一个值为NULL,则停止。如果不为NULL,则可以比较对象。我不太了解PS如何使这些try/catch短语起作用。 - E.V.I.L.

0

有一个解决方法可以使用

首先,创建两个空数组对象

$reference = @()
$difference = @() 

现在

检查您的源数组是否不为空,并将它们添加到先前创建的数组中

If( $array1 -ne $null ){ $reference.addrange($array1) 
If($array2 -ne $null) { $diffrence.addrange($array2) 

现在你可以确定你的引用数组和差异数组不是空的,即使它们可能为空,你也可以安全地进行比较。
Compare-object -referenceObject $reference -differenceObject $difference 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接