奇怪的数组比较问题

时间:2019-05-23 15:07:17

标签: powershell

我正在向文件中写入一些内容,然后测试该文件的内容是否返回false;但是the是一样的。

该字符串是一个大的多行字符串。当使用相同的字符串使用相同的代码来执行此代码时,它将按预期工作。

请查看以下测试。我无法解释为什么比较这两个变量会返回false,但compare-object却没有区别。

第二个代码示例显示了预期的行为。

PS H:\DFSMigration> $test = Invoke-Expression -Command "dfscmd.exe /view \\mydomain.com\rootdfs /batchrestore"

PS H:\DFSMigration> $test | Set-Content .\backup.txt

PS H:\DFSMigration> $test2 = Get-Content .\backup.txt

PS H:\DFSMigration> if ($test -eq (Get-Content .\backup.txt)) {"True"} Else{"false"}
false

PS H:\DFSMigration> if ($test -eq $test2) {"True"} Else{"false"}
false

PS H:\DFSMigration> Compare-Object -ReferenceObject $test -DifferenceObject $test2

PS H:\DFSMigration> $test.count
2256

PS H:\DFSMigration> $test2.count
2256

PS H:\DFSMigration> $test.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS H:\DFSMigration> $test2.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

这是预期的行为:

PS H:\DFSMigration> $test =  "This is a test string with loads of foobar"

PS H:\DFSMigration> $test | Set-Content backuptest.txt

PS H:\DFSMigration> $test2 = Get-Content backuptest.txt

PS H:\DFSMigration> If($test -eq $test2){ "The strings are equal"} Else { "They're not equal"}
The strings are equal

2 个答案:

答案 0 :(得分:0)

$test$test2是2个不同的数组,因此不相等。如果要遍历数组中的每个元素,您将看到它们包含相同的字符串。

for ($i=0; $i -lt $test.Length; $i++) {
    if ($test[$i] -eq $test2[$i]) { "True" } else { "False" }
}

答案 1 :(得分:0)

我将使用Compare-Object来确定数组是否相同。 默认情况下,它将查找差异并指出包含每个差异的面。因此,如果没有差异,则计数将为0。

请注意,使用此方法时,数组中每个项目的位置均不视为差异。如果应将不同顺序视为不相等,那么For循环将更适合。

$Arr1 = @('apple', 'banana', 'orange','tomato')
$Arr2 = @('tomato', 'potato', 'carrot')
$Arr3 = @('apple', 'banana', 'orange', 'tomato')

$Same = (Compare-Object -ReferenceObject $Arr1 -DifferenceObject $Arr2).count -eq 0
if ($Same) { Write-Host '$Arr1 is equal to $Arr2' -ForegroundColor Cyan } else { Write-Host ':(- $Arr1 is NOT equal to $Arr2'}

 $Same = (Compare-Object -ReferenceObject $Arr3 -DifferenceObject $Arr1).count -eq 0
if ($Same) { Write-Host '$Arr1 is equal to $Arr3' -ForegroundColor Cyan }