在比较对象中替换 SideIndicator 的箭头

ATK*_*iwi 2 powershell compareobject

我可以将 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
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

InputObject           SideIndicator
-----------           -------------
thing.dll                 =>
stuff.dll                 <=
software.exe              <=
Run Code Online (Sandbox Code Playgroud)

该报告已提供给测试人员,如果我可以将 SideIndicators 更改为文本,对他们来说会更清晰。

我想要的输出:

InputObject           SideIndicator
-----------           -------------
thing.dll                Not in 18
stuff.dll                Not in 17
software.exe             Not in 17
Run Code Online (Sandbox Code Playgroud)

或者类似的东西,他们可以在不必知道哪个是引用/差异对象的情况下获得它的要点。

我有一个初步的想法,但搜索类似的东西并不会产生很多结果。不知道是不是一定要if循环,还是可以把PS里的括号换掉。对 PS 还是新手,所以我非常感谢您的帮助!

Ben*_*enH 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
Run Code Online (Sandbox Code Playgroud)

或者你可以只用正则表达式一步替换字符串:

$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
Run Code Online (Sandbox Code Playgroud)