Назад | Перейти на главную страницу

Результаты выбора объектов сравнения Powershell с обеих сторон

Я прочитал много примеров сравнения двух объектов, списков, массивов и т. Д. То, что я не могу найти или сделать, - это после сравнения объектов и определения того, какие из них равны, вывести некоторые свойства ОБЕИХ объектов

$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.