Разница в объектах сравнения с учетом порядка PowerShell

#powershell

#powershell

Вопрос:

Возможно ли выполнить сравнение порядка элементов в массивах с Compare-Object помощью aka diff в PowerShell? если нет, предложите обходной путь.

 $a1=@(1,2,3,4,5)
$b1=@(1,2,3,5,4)
if (Compare-Object $a1 $b1) {
    Write-Host 'Wrong order '
}
else {
    Write-Host 'OK' 
}
 

Комментарии:

1. разве вы не можете использовать if($ a1 -ne $ b1) {} в этом случае? если они идентичны?

2. разве вы не можете легко отсортировать их? $a1 = $a1 | sort-object или через get-Enumerator(), если вам нужно, чтобы они были отсортированы?

3. А что, если они содержат разные вещи, но оба отсортированы по порядку?

Ответ №1:

Использовать -SyncWindow 0 :

 $a1=@(1,2,3,4,5)
$b1=@(1,2,3,5,4)
if (Compare-Object $a1 $b1 -SyncWindow 0) {
    Write-Host 'Wrong order '
}
else {
    Write-Host 'OK' 
}
 

Дополнительная информация: Сравнение массивов в Windows PowerShell.

Ответ №2:

Вы можете сравнивать элементы в массивах значение за значением, например:

 $a1=@(1,2,3,4,5,6,7,8,9,10)
$b1=@(1,2,3,5,4,6,7,9,8,10)

$i= 0
$counter = 0
$obj = @()

foreach ($a in $a1)
{
    $sub_obj = New-Object PSObject
    $sub_obj | Add-Member -MemberType NoteProperty -Name Value1 -Value $a      
    $sub_obj | Add-Member -MemberType NoteProperty -Name Value2 -Value $b1[$i]
    if ($a -eq $b1[$i])
    {
         $sub_obj | Add-Member -MemberType NoteProperty -Name IsMatch -Value $true
    }
    else
    {
        $sub_obj | Add-Member -MemberType NoteProperty -Name IsMatch -Value $false
        $counter  
    }
    $obj  = $sub_obj
    $i  
}

Write-Output $obj | Format-Table -AutoSize

if ($counter -gt 0)
{Write-Host 'Wrong order!'}
else
{Write-Host 'Correct order!'}
 

Вывод:

 Value1 Value2 IsMatch
------ ------ -------
     1      1    True
     2      2    True
     3      3    True
     4      5   False
     5      4   False
     6      6    True
     7      7    True
     8      9   False
     9      8   False
    10     10    True


Wrong order!