将数组与null元素进行比较

时间:2015-01-08 04:47:52

标签: powershell

我有两个数组有超过500,000个值,需要比较才能找到差异。数组中的某些值为$null。当我尝试执行以下代码并收到错误Compare-Object : Cannot bind argument to parameter 'ReferenceObject' because it is null

是否有解决此问题的方法或是否有更好,更快的方法来找到差异?我只对方差/差异的数量感兴趣。

谢谢!

示例代码:

$objSource = @('a', $null, 'c')
$objTarget = @('a', 'b','c')
Compare-Object -ReferenceObject $objSource -DifferenceObject $objTarget | Measure

错误讯息:

Compare-Object : Cannot bind argument to parameter 'ReferenceObject' because it is null . At line:4 char:32
+ Compare-Object -ReferenceObject <<<<  $objSource -DifferenceObject $objTarget
    + CategoryInfo          : InvalidData: (:) [Compare-Object], ParameterBindingValid     ationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft     .PowerShell.Commands.CompareObjectCommand

2 个答案:

答案 0 :(得分:3)

documentation表示如果-ReferenceObject-DifferenceObject$null,则会发生这种情况,但如果这些对象的任何元素都没有实际覆盖,则会发生这种情况。

  

注意:如果引用集或差集为null($ null),则Compare-Object会生成终止错误。

快速解决方法是用控制字符替换那些$null元素或类似的东西。

$objSource = @('a', $null, 'c') -replace "^$","null"
$objTarget = @('a', 'b','c') -replace "^$","null"
Compare-Object -ReferenceObject $objSource -DifferenceObject $objTarget

-replace将使用字符串“null”从数组中删除那些空条目。所以我们现在可以直观地看到这些数据。不太可能,该文本将是一个自然元素,但你必须保持警惕相同。如果null不合适,我会建议将bagel作为关键字!

答案 1 :(得分:2)

这似乎有效:

$objSource = @('a', $null, 'c')
$objTarget = @('a', 'b','c')
Compare-Object -ReferenceObject ([string[]]$objSource) -DifferenceObject ([string[]]$objTarget) | Measure