Заменить стрелки для SideIndicator в Compare-Object - PullRequest
0 голосов
/ 31 мая 2018

Могу ли я изменить вывод для SideIndicators в результате Compare-Object на что-то более удобное для обычных пользователей?

У меня есть скрипт, который сравнивает папку версии нашего программного обеспечения на 2017 год и текущуюВерсия 2018 года.

$var1 = Get-ChildItem -Recurse -path C:\software18\bin
$var2 = Get-ChildItem -Recurse -path C:\software17\bin
Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 > C:\diff.txt

Вывод выглядит следующим образом:

InputObject           SideIndicator
-----------           -------------
thing.dll                 =>
stuff.dll                 <=
software.exe              <=

Отчет передается тестировщикам, и для него было бы чище, если бы я мог изменить SideIndicators на текст.

Мой желаемый результат:

InputObject           SideIndicator
-----------           -------------
thing.dll                Not in 18
stuff.dll                Not in 17
software.exe             Not in 17

Или что-то похожее, где они могут получить суть этого, не зная, что является эталонным / разностным объектом.

У меня есть первоначальная идея, но поиск чего-то подобного не дает много результатов.Не знаю, нужно ли мне делать цикл if или я могу заменить скобки в PS.Все еще новичок в PS, поэтому я очень благодарен за помощь!

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Краткое решение с использованием Select-Object с вычисленным свойством :

Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 |
  Select-Object InputObject, @{ 
   n='SideIndicator';
   e={ @{ '<=' = 'Not in 18'; '=>' = 'Not in 17' }[$_.SideIndicator] }
  } > C:\diff.txt
0 голосов
/ 31 мая 2018

Вы можете зацикливаться на каждом объекте, создавая условные обозначения для каждого бокового индикатора:

$var1 = Get-ChildItem -Recurse -path C:\software18\bin
$var2 = Get-ChildItem -Recurse -path C:\software17\bin
(Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 -PassThru |
    ForEach-Object {
        if ($_.SideIndicator -eq '=>') {
            $_.SideIndicator = 'Not in 18'
        } elseif ($_.SideIndicator -eq '<=')  {
            $_.SideIndicator = 'Not in 17'
        }
        $_
    }) > C:\diff.txt

Или вы можете просто выполнить регулярное выражение для замены строк за один шаг:

$var1 = Get-ChildItem -Recurse -path C:\software18\bin
$var2 = Get-ChildItem -Recurse -path C:\software17\bin
(Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 -PassThru |
    ForEach-Object {
        $_.SideIndicator = $_.SideIndicator -replace '=>','Not in 18' -replace '<=','Not in 17'
        $_
    }) > C:\diff.txt
0 голосов
/ 31 мая 2018

При сохранении исходных / разностных источников в переменной вместо прямого расширения вы можете заменить боковой указатель на путь.

На основе ответа BenH:

$Ref = "C:\software18\bin"
$Dif = "C:\software17\bin"
(Compare-Object -Ref (ls -r $Ref) -Dif (ls -r $Dif)|
    ForEach-Object {
        if ($_.SideIndicator -eq '=>') {
            $_.SideIndicator = "Not in $Ref"
        } elseif ($_.SideIndicator -eq '<=')  {
            $_.SideIndicator = "Not in $Dif"
        }
        $_
    }
) > C:\diff.txt

Имитация вывода:

InputObject           SideIndicator
-----------           -------------
thing.dll             Not in C:\software18\bin
stuff.dll             Not in C:\software17\bin
software.exe          Not in C:\software17\bin
0 голосов
/ 31 мая 2018

Давным-давно я написал сценарий, использующий объект сравнения для сравнения установленных исправлений на нескольких компьютерах в кластере.http://get -powershell.com / post / 2009/08/28 / Comparing-Installed-Hotfixes-on-Servers.aspx

Я использовал оператор switch для различных условийSideIndicator.

$comparedHotfixes = compare-object $server2HotFix $server1HotFix -IncludeEqual 

$result = @(); 

foreach ($c in $comparedHotfixes) { 
    $kbinfo = "" | select KB,$server1,$server2 
    $kbinfo.KB = $c.InputObject.HotfixId 
    switch ($c.SideIndicator) 
    { 
    "==" { 
            write-host -ForegroundColor Green "Both servers have $($c.InputObject.HotfixId)" 
            $kbinfo.($server1) = $true 
            $kbinfo.($server2) = $true 
            $result += $kbinfo 
         } 

    "=>" { 
            write-host -ForegroundColor Yellow "$server1 has $($c.InputObject.HotfixId) but $server2 doesn't" 
            $kbinfo.($server1) = $true 
            $kbinfo.($server2) = $false 
            $result += $kbinfo 
          } 

    "<="  { 
            write-host -ForegroundColor Magenta "$server2 has $($c.InputObject.HotfixId) but $server1 doesn't" 
            $kbinfo.($server1) = $false 
            $kbinfo.($server2) = $true 
            $result += $kbinfo 
          } 
    } # End Switch 
  } # End foreach 
...