Странная проблема сравнения массивов - PullRequest
0 голосов
/ 23 мая 2019

Я записываю некоторое содержимое в файл, а затем проверяю содержимое файла, оно возвращает false; однако укусы идентичны.

Строка - это большая многострочная строка. Когда это тот же самый код с простой строкой, он работает как положено.

Пожалуйста, посмотрите на следующий тест. Я не могу объяснить, почему сравнение двух переменных возвращает ложь, но объект сравнения не находит разницы.

Второй пример кода показывает ожидаемое поведение.

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 ]

1 голос
/ 23 мая 2019

Я бы использовал 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 }
0 голосов
/ 23 мая 2019

$test и $test2 - это 2 разных массива, поэтому они не равны.Если бы вы перебрали каждый элемент в массивах, вы увидите, что они содержат одинаковые строки.

for ($i=0; $i -lt $test.Length; $i++) {
    if ($test[$i] -eq $test2[$i]) { "True" } else { "False" }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...