我能够与数组进行比较并获得元素的索引,但这种内置的Compare-Object函数返回一个奇怪的值。当我运行此代码时,它返回值-1。
这是我的代码。
# compare to arrays
$array1 = @(1,2,3,4,5)
$array2 = @(1,2,7,4,5)
$difference = Compare-Object $array1 $array2
# get the position of the difference in arrays
[array]::IndexOf($array1, $difference)
[array]::IndexOf($array2, $difference)
结果
PS C:\...\2017-06-25> C:\...\2017-06-25\compareArrays.ps1
-1
-1
我将使用它来读取文件并进行比较,并告诉我文件中的差异在哪里。
答案 0 :(得分:1)
问题是Compare-Object
的输出与您在IndexOf()
中的使用方式不符。
Compare-Object $array1 $array2
InputObject SideIndicator
----------- -------------
7 =>
3 <=
所以你要找的是将它分成两个独立的数组。一个只匹配左侧,一个匹配右侧。将Where
方法与Split
一起使用可以轻松实现。
$RightDiffs,$LeftDiffs = $difference.where({$_.SideIndicator -eq "=>"},'Split')
在您的示例中,每个中只有一个不同,但可能每个都有多个对象,因此我们需要遍历每个对象。我们只想要InputObject
属性。
foreach ($LeftDiff in $LeftDiffs.InputObject) {
[array]::IndexOf($array1, $LeftDiff )
}
foreach ($RightDiff in $RightDiffs.InputObject) {
[array]::IndexOf($array2, $RightDiff)
}
答案 1 :(得分:1)
也许像
function Compare-Array {
param(
[Array] $array1,
[Array] $array2
)
if ( -not (Compare-Object $array1 $array2) ) {
return -1
}
for ( $i = 0; $i -lt $array1.Count; $i++ ) {
if ( $array1[$i] -eq $array2[$i] ) {
return $i
}
}
return $array1.Length
}
如果数组相等则返回-1,或者两者之间的第一个差异的索引。