如何在 PowerShell 中比较具有一列的两个表略有不同?

How to compare two tables with one column that is slightly different in PowerShell?

我想比较来自两个不同目录的文件的版本信息。

我可以这样做:

$files1 = (Get-Item "$path1\*.dll").VersionInfo
$files2 = (Get-Item "$path2\*.dll").VersionInfo
compare-object $files1 $files2

但后来我得到了类似的东西:

InputObject
-----------
File:             path1\AxInterop.ShDocVw.dll...
File:             path1\dom.dll...
(etc...)
File:             path2\AxInterop.ShDocVw.dll...
File:             path2\dom.dll...
(etc...)

我想我可以这样做:

$files1 = (Get-Item "$path1\*.dll").VersionInfo.ProductVersion
$files2 = (Get-Item "$path2\*.dll").VersionInfo.ProductVersion
compare-object $files1 $files2
$files1 = (Get-Item "$path1\*.dll").VersionInfo.FileVersion
$files2 = (Get-Item "$path2\*.dll").VersionInfo.FileVersion
compare-object $files1 $files2

但如果有差异,我将不得不去寻找差异是什么。我无法直接比较文件,因为一组已签名而另一组未签名。

最好的方法是什么?

澄清一下,当前的 compare-object cmdlet 不满足我的需要,因为它显示文件名不同,因为它显示它们具有不同的路径。这与我无关。

我想比较文件名相同但版本号不同的行。如果发现相同文件名的版本号不同,或者其中一个表中不存在文件名,则显示差异。

使用 Compare-Object cmdlet 的 -Property 参数比较并输出感兴趣的属性。

Group-Object allows grouping the resulting objects, and Select-Object 可用于从组对象中为每个文件名生成单个输出对象:

$files1 = (Get-Item $path1\*.dll).VersionInfo
$files2 = (Get-Item $path2\*.dll).VersionInfo

Compare-Object $files1 $files2 -Property { Split-Path -Leaf $_.FileName }, 
                                         ProductVersion, 
                                         FileVersion |
  Group-Object -Property ' Split-Path -Leaf $_.FileName ' | 
    Select-Object Name, 
           @{ n = 'SideIndicator'; e = { $_.Group.SideIndicator } },
           @{ n = 'ProductVersion'; e = { $_.Group.ProductVersion -join ' <-> ' } }, 
           @{ n = 'FileVersion'; e = { $_.Group.FileVersion -join ' <-> ' } }           

注意 的使用仅通过文件 name 比较输入对象,稍后通过 Group-ObjectGroup-Object 的输出中提取信息=15=].

不幸的是,从 PowerShell [Core] 7.0 开始,Compare-Object 不允许您 name 计算属性 [1]implied 属性 名字是脚本块的文字内容({ ... }),
 Split-Path -Leaf $_.FileName ,这是必须传递给 Group-Object -Property

上面的结果如下:

Name         SideIndicator ProductVersion              FileVersion
----         ------------- --------------              -----------
file1234.exe {=>, <=}      7.0.18362.1 <-> 7.0.18365.0 7.0.18362.1 <-> 7.0.18365.0
file1235.exe <=            10.0.18362.1                10.0.18362.1

也就是说,对于存在于两个 位置但版本号不同的文件,SideIndicator 显示
{=>, <=}*Version 属性中可能不同的版本号由 <->

分隔

[1] 添加在 Compare-Object 上下文中命名计算属性的功能是 this GitHub feature request.

的主题