Я прочитал много примеров сравнения двух объектов, списков, массивов и т. Д. То, что я не могу найти или сделать, - это после сравнения объектов и определения того, какие из них равны, вывести некоторые свойства ОБЕИХ объектов
$sourceFiles | % { Compare-Object $_ $destFiles -IncludeEqual -ExcludeDifferent -Property Name}
Это дает ожидаемый результат (т.е.):
Name SideIndicator
---- -------------
log4net.dll ==
Ninject.dll ==
Ninject.Extensions.Wcf.dll ==
Как я могу затем вернуться к списку и вывести что-то вроде этого (я могу сделать это только с первым списком, используя $ _, но я не знаю, как получить свойство списка назначения:
Name Path1 Path2
---- ------------- ---------------
log4net.dll C:\test\ \\server\test
Ninject.dll C:\test\ \\server\test
Ninject.Extensions.Wcf.dll C:\test\ \\server\test
У меня примерно так:
$source | ForEach-Object {
$c = Compare-Object $_.Name $dest.Name -IncludeEqual -ExcludeDifferent
if ($c.SideIndicator.ToString() -eq "=="){
$_ | Select-Object Name, DirectoryName
}
}
но вывод предназначен только для объектов на первой стороне сравнения ($ source). Как я могу связать этот вывод со вторым списком ($ dest)?
Вам нужно будет построить [PSCustomObject]
используя Имя, чтобы выбрать каталог из $ sourceFiles и $ destFiles.
Нет необходимости использовать ForEach для $ sourceFiles, сравнивайте переменные напрямую.
$SourceFiles = Get-ChildItem 'C:\bat\' -File
$destFiles = Get-ChildItem 'K:\Bat\' -File
Compare-Object $sourceFiles $destFiles -IncludeEqual -ExcludeDifferent -Property Name|
ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
Path1 = ($SourceFiles | Where-Object Name -eq $_.Name).Directory
Path2 = ($destFiles | Where-Object Name -eq $_.Name).Directory
}
}
Пример вывода:
Name Path1 Path2
---- ----- -----
Arp-Scan.cmd C:\bat K:\Bat
Arp-Scan.Log C:\bat K:\Bat
BatchLib.cmd C:\bat K:\Bat
BatchLib.INC C:\bat K:\Bat
Если вы знаете, откуда берутся файлы $ sourceFiles / $ destFiles, и они не собираются рекурсивно Path1/Path2
статичны, поэтому приведенный выше сценарий является излишним для ИМО.
В противном случае вам следует уточнить происхождение $ sourceFiles / $ destFiles.