Powershell

Powershell compare-object select 雙方的結果

  • April 22, 2022

我讀過很多比較兩個對象、列表、數組等的例子。我似乎找不到或做的是在比較對象並找到哪個相等之後,輸出兩個對象的一些屬性

$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). How can I relate this output to the second list ( $ 目的地)?

您必須[PSCustomObject]使用名稱建構一個從兩者中選擇目錄 $ sourceFiles and $ 目標文件。

不必在 $sourceFiles 上使用 ForEach,直接比較變數。

$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是靜態的,所以上面的腳本是 IMO 過大的。

否則你應該詳細說明 $ sourceFiles/ $ 目標文件。

引用自:https://serverfault.com/questions/954022