Powershell
Powershell compare-object select 雙方的結果
我讀過很多比較兩個對象、列表、數組等的例子。我似乎找不到或做的是在比較對象並找到哪個相等之後,輸出兩個對象的一些屬性
$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/ $ 目標文件。