如何在 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-Object
从 Group-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.
的主题
我想比较来自两个不同目录的文件的版本信息。
我可以这样做:
$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 ' <-> ' } }
注意 Group-Object
从 Group-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.