PowerShell Core 7 против Windows Powershell 5.1 - отдельные результаты сравнения объектов - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь сравнить 2 каталога с объектом сравнения с помощью PowerShell Core 7.0. После нескольких попыток я получал странные результаты, поэтому я попытался использовать тот же код в Windows Powershell 5.1. Итак, когда я использую Powershell Core 7.0, это результаты:

    PS C:\> $folderLeft = Get-ChildItem -Path 'C:\Tests'
    PS C:\> $folderRight = Get-ChildItem -Path 'C:\Tests2'
    PS C:\> Compare-Object -ReferenceObject $folderLeft -DifferenceObject $folderRight

InputObject               SideIndicator
-----------               -------------
C:\Tests2\UTILS           =>
C:\Tests2\test - copy.txt =>
C:\Tests2\test.txt        =>
C:\Tests\UTILS            <=
C:\Tests\test.txt         <=

Когда я использую WindowsPowerShell 5.1:

PS C:\> $folderLeft = Get-ChildItem -Path 'C:\Tests'
PS C:\> $folderRight = Get-ChildItem -Path 'C:\Tests2'
PS C:\> Compare-Object -ReferenceObject $folderLeft -DifferenceObject $folderRight

InputObject     SideIndicator
-----------     -------------
test - copy.txt =>

, я получаю желаемые результаты в WindowsPowerShell 5.1.

Кто-нибудь знает, есть ли способ решить эту проблему в PowerShell Core?

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Это немного сложно. Если вы хотите получить полное сравнение, включая подкаталоги, вам нужно будет создать подстроку, а затем выполнить сравнение на ней:

$folderLeft = 'C:\Tests'
$folderLeftFiles = Get-ChildItem -Path folderLeft  | Sort-Object
$folderLeftFiles | Add-Member -MemberType NoteProperty -Name compare -Value 'init'
$folderLeftFiles | ForEach-Object {$_.compare= ($_.FullName.Substring(($folderLeft.Length+1),($_.FullName.Length- ($folderLeft.Length+1))))} 

<#
do the same for folderRight
#>
 $difference = Compare-Object -ReferenceObject $folderLeftFiles.('compare') -DifferenceObject $folderRightFiles.('compare')

В частности, с подпапками, другие решения могут не дать вам правильного результат.

Этот код работает в версиях v5 и v7 PowerShell

0 голосов
/ 27 мая 2020

Я могу сказать вам, почему это происходит. В ps 7 объекты file и dir преобразуются в строки с полным именем, но в ps 5 они преобразуются только в само имя. Обычно compare-object преобразует объекты в строки и сначала сортирует их, за некоторыми редкими исключениями, такими как datetime, которые поддерживают -gt / -lt. Для работы он должен иметь возможность сортировать списки.

$folderLeft[0].tostring()   # ps 7
C:\Tests\UTILS

$folderLeft[0].tostring()   # ps 5
UTILS

$folderleft[0] -gt $folderleft[1]
Cannot compare "utils" because it is not IComparable.
At line:1 char:1
+ $folderleft[0] -gt $folderleft[1]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NotIcomparable

Вы можете выбрать свойства для сравнения, и это будет работать в ps7. Он не будет проверять все свойства автоматически.

Compare-Object $folderLeft $folderRight -property name

name            SideIndicator
----            -------------
test - copy.txt =>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...