2

我可以将 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

4 回答 4

7

您可以循环遍历每个对象,为每个侧面指示器设置一个条件:

$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
于 2018-05-31T17:15:14.803 回答
3

将参考/差异源存储到变量中而不是直接扩展时,您可以将 sideindicator 替换为路径。

根据 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
于 2018-05-31T17:54:37.183 回答
2

Select-Object使用计算属性的简洁解决方案:

Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 |
  Select-Object InputObject, @{ 
   n='SideIndicator';
   e={ @{ '<=' = 'Not in 18'; '=>' = 'Not in 17' }[$_.SideIndicator] }
  } > C:\diff.txt
于 2018-06-01T03:49:27.753 回答
2

很久以前,我写了一个脚本,它使用 compare-object 来比较集群中多台机器上安装的修补程序。http://get-powershell.com/post/2009/08/28/Comparing-Installed-Hotfixes-on-Servers.aspx

我所做的是针对 SideIndicator 的不同条件使用 switch 语句。

$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 
于 2018-05-31T17:02:15.757 回答