我见过powershell脚本,我也记得.我想添加的是另一列,它将显示旁边指标比较器("==","<=","=>")并将它们命名为MATCH(如果"==")和MISMATCH(如果"<="和"=>").有关如何做到这一点的任何建议?
这是脚本的链接(Credits to Florent Courtay) 我如何重新组织powershell的比较对象输出?
$a = Compare-Object (Import-Csv 'C:\temp\f1.csv') (Import-Csv 'C:\temp\f2.csv') -property Header,Value
$a | Group-Object -Property Header | % { New-Object -TypeName psobject -Property @{Header=$_.name;newValue=$_.group[0].Value;oldValue=$_.group[1].Value}}
Run Code Online (Sandbox Code Playgroud)
================================================== ======================
我想到的输出:
Header1 Old Value New Value STATUS
------ --------- --------- -----------
String1 Value 1 Value 2 MATCH
String2 Value 3 Value 4 MATCH
String3 NA Value 5 MISMATCH
String4 Value 6 NA MISMATCH
Run Code Online (Sandbox Code Playgroud)
这是一个独立的解决方案; 只需ConvertFrom-Csv用您的Import-Csv电话替换来电:
# Sample CSV input.
$csv1 = @'
Header,Value
a,1
b,2
c,3
'@
$csv2 = @'
Header,Value
a,1a
b,2
d,4
'@
Compare-Object (ConvertFrom-Csv $csv1) (ConvertFrom-Csv $csv2) -Property Header, Value |
Group-Object Header | Sort-Object Name | ForEach-Object {
$newValIndex, $oldValIndex = ((1, 0), (0, 1))[$_.Group[0].SideIndicator -eq '=>']
[pscustomobject] @{
Header = $_.Name
OldValue = ('NA', $_.Group[$oldValIndex].Value)[$null -ne $_.Group[$oldValIndex].Value]
NewValue = ('NA', $_.Group[$newValIndex].Value)[$null -ne $_.Group[$newValIndex].Value]
Status = ('MISMATCH', 'MATCH')[$_.Group.Count -gt 1]
}
}
Run Code Online (Sandbox Code Playgroud)
以上产量:
Header OldValue NewValue Status
------ -------- -------- ------
a 1 1a MATCH
c 3 NA MISMATCH
d NA 4 MISMATCH
Run Code Online (Sandbox Code Playgroud)
注意:
假设每个输入文件中给定的Header列值最多出现一次.
在Sort-Object Name需要调用由排序输出Header值谢谢,LotPings.
因为,由于如何Compare-Object订购其输出(右侧,仅第一项),通过创建组的顺序Group-Object将不会自动反映标头值的第一个CSV的订单(d会出现之前c).