首页 > 解决方案 > PowerShell Core 7 与 Windows Powershell 5.1 - 比较对象不同的结果

问题描述

我正在尝试使用 PowerShell Core 7.0 将 2 个目录与 compare-object 进行比较。经过一些尝试,我得到了奇怪的结果,因此我尝试在 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 中解决这个问题?

标签: powershell

解决方案


我可以告诉你为什么会这样。在 ps 7 中,文件和 dir 对象转换为具有全名的字符串,但在 ps 5 中,它们仅转换为名称本身。通常 compare-object 会将对象转换为字符串并首先对它们进行排序,有一些罕见的例外,例如支持 -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 =>


推荐阅读