2015-01-08 3 views
1

У меня есть два массива с более чем 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 

ответ

3

В documentation говорится, что это произошло бы, если бы -ReferenceObject или -DifferenceObject были $null, но на самом деле не покрывает если какие-либо элементы этих объектов находятся.

ПРИМЕЧАНИЕ. Если набор ссылок или набор разностей равен нулю ($ null), Compare-Object генерирует завершающую ошибку.

Быстрая работа вокруг будет заключаться в замене тех элементов $null элементами управления или что-то в этом направлении.

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

The -replace бы удалить эти пустые элементы из массива со строкой "нулевой". Таким образом, у нас будет визуальная индикация этих данных. Маловероятно, что этот текст будет естественным элементом, но вы должны быть осторожны. Если null не подходит, я бы порекомендовал бублик как ключевое слово!

2

Это похоже на работу:

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

Да, это работает, но результат всегда 2. Я хотел бы, чтобы найти количество отклонений. – Sarang

Смежные вопросы