Как сравнить две таблицы с одним столбцом, который немного отличается в 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 не соответствует моим потребностям, потому что он показывает имя файла как другое, потому что он показывает, что у них разные пути. Это не имеет значения для меня.

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


person Adrian    schedule 27.02.2020    source источник
comment
Вы должны указать Compare-Object, какое свойство следует использовать для сравнения... Compare-Object -ReferenceObject $files1 -DifferenceObject $files2 -Property FileName,FileVersion   -  person Olaf    schedule 28.02.2020


Ответы (1)


Используйте параметр -Property командлета Compare-Object, чтобы сравнить и вывести интересующие свойства.

Group-Object позволяет группировать полученные объекты, а 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 через Select-Object.

К сожалению, Compare-Object в PowerShell [Core] 7.0 не позволяет вам называть вычисляемые свойства[1] и подразумеваемые свойства name — это буквальное содержимое блока скрипта ({ ... }),
 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 является предметом этот запрос функции GitHub.

person mklement0    schedule 28.02.2020
comment
Рад слышать, что это было полезно, @Adrian; Не за что. - person mklement0; 28.02.2020