#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!