替换比较对象中 SideIndicator 的箭头
Replace Arrows for SideIndicator in Compare-Object
我可以将 Compare-Object
的 SideIndicators 输出更改为对标准用户更友好的输出吗?
我有一个脚本可以比较我们软件的 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
或者类似的东西,他们可以在不需要知道哪个是 reference/difference 对象的情况下获得它的要点。
我有一个初步的想法,但搜索类似的东西并没有产生很多结果。不知道我是否必须执行 if
循环或者我可以替换 PS 中的括号。 PS 还是个新手,非常感谢您的帮助!
很久以前,我写了一个脚本,它使用比较对象来比较集群中多台机器上安装的修补程序。 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
您可以循环遍历每个对象,为每个边指示器设置条件:
$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
将 Reference/Difference 源存储到变量而不是直接展开时,您可以用路径替换边指示符。
根据 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
使用 Select-Object
和 的简洁解决方案:
Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 |
Select-Object InputObject, @{
n='SideIndicator';
e={ @{ '<=' = 'Not in 18'; '=>' = 'Not in 17' }[$_.SideIndicator] }
} > C:\diff.txt
我可以将 Compare-Object
的 SideIndicators 输出更改为对标准用户更友好的输出吗?
我有一个脚本可以比较我们软件的 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
或者类似的东西,他们可以在不需要知道哪个是 reference/difference 对象的情况下获得它的要点。
我有一个初步的想法,但搜索类似的东西并没有产生很多结果。不知道我是否必须执行 if
循环或者我可以替换 PS 中的括号。 PS 还是个新手,非常感谢您的帮助!
很久以前,我写了一个脚本,它使用比较对象来比较集群中多台机器上安装的修补程序。 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
您可以循环遍历每个对象,为每个边指示器设置条件:
$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
将 Reference/Difference 源存储到变量而不是直接展开时,您可以用路径替换边指示符。
根据 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
使用 Select-Object
和
Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 |
Select-Object InputObject, @{
n='SideIndicator';
e={ @{ '<=' = 'Not in 18'; '=>' = 'Not in 17' }[$_.SideIndicator] }
} > C:\diff.txt