powershell - 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 中解决这个问题?
解决方案
我可以告诉你为什么会这样。在 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 =>
推荐阅读
- c# - 通过 Linq 和 EF 选择链接表的空列表
- android - Android studio error - react native using firebase
- greenplum - 表greenplum数据库中缺少分布键
- excel - 如何从 maatwebsite/Excel 向集合添加额外数据
- git - 如何获取 github 文件的查询 url?
- python - 在尝试粘贴时,使用 tkinter 从 Windows 10 中的 Python 3.4 复制到剪贴板会导致崩溃
- android - simd 是否包含在 Android NDK 中
- python - python从套接字流接收图像
- javascript - Nodejs发布未访问文件所在的目录
- javascript - 单击添加按钮后元素立即消失