我借用了一些PowerShell代码来比较哈希表,并返回一个自定义对象,其中包含哈希条目的名称和差异指示。我想输出返回的差异。
对象:
function result( [string]$side ) {
if ($ReturnVals) {
New-Object PSObject -Property @{
'InputKey'= "$path$key";
'SideIndicator' = $side;
'ReferenceValue' = $refValue;
'DifferenceValue' = $difValue;
}
}
else {
New-Object PSObject -Property @{
'InputKey'= "$path$key";
'SideIndicator' = $side;
}
}
}
使用返回的对象时,如果它是Null或有多个条目,一切都很好,GetEnumerator会执行所需操作并将输出分类到文件中:
if ($comp -eq $Null) {
write-host $d "No Differences"
out-file -filepath $of -inputobject "`nNo Differences" -Encoding UTF8 -append
}
else {
write-host $d "Differences"
$comp.GetEnumerator() | Sort-Object -property InputKey |
out-file -filepath $of -append -Encoding UTF8
}
如果存在一个差异,PowerShell会抛出错误,因为该对象没有方法GetEnumerator:
方法调用失败,因为[System.Management.Automation.PSCustomObject]不包含名为“GetEnumerator”的方法。
我尝试使用.count来查看是否有一个区别,但我没有只计算一个。我得到一个2或更多的计数。
自定义对象对我的PowerShell技能来说有点先进。有关如何防止对象中一个项目出错的任何建议吗?
答案 0 :(得分:2)
Get-Enumerator是一种数组方法。如果函数只返回一个对象,则不会获得数组,因此该方法不起作用。这是正常和预期的行为。
您可以修改函数以始终返回数组,但这是一种非标准方法。您希望该函数尽可能像其他cmdlet一样运行。最好在主脚本中强制它进入函数外部的数组:
$comp = @(result)
答案 1 :(得分:1)
使用逗号运算符始终将值作为数组返回:
function result( [string]$side ) {
if ($ReturnVals) {
$obj = New-Object PSObject -Property @{
'InputKey'= "$path$key";
'SideIndicator' = $side;
'ReferenceValue' = $refValue;
'DifferenceValue' = $difValue;
}
}
else {
$obj = New-Object PSObject -Property @{
'InputKey'= "$path$key";
'SideIndicator' = $side;
}
}
return ,$obj
}
答案 2 :(得分:0)
似乎当$comp
是一个项目时,它不是一个数组。您需要将$comp
“初始化”为空数组。我没有看到它在你的代码中的来源,但是这样的事情应该有效:
#This creates an empty array
$comp = @()
$comp += $foo
答案 3 :(得分:0)
这些都是很好的答案。我将不得不尝试它们,看看我是否能理解它为什么起作用以及它为什么不起作用。我制定了一个强力解决方案,从GetType查看项目类型,如果是PSOBJECT或OBJECT则采取行动。来自两个测试的抄本,有多个项目,它是一个System.Object,只有一个是... PSCustomObject。
**********************
Windows PowerShell Transcript Start
Start time: 20140221140133
2014-02-21 2:02:01 PM Reading File 1
2014-02-21 2:02:02 PM Loading File 1 to Dictionary
2014-02-21 2:02:28 PM Reading File 2
2014-02-21 2:02:29 PM Loading File 2 to Dictionary
2014-02-21 2:02:56 PM Lines Compare
*** The value of comp variable is: @{InputKey=REPT.CRW.ARC_DIR_LST; SideIndicator=<>} @{InputKey=AD.CRW.PRDHOT07Y05; SideIndicator=<>}
*** The length of comp is: 2
*** The type is: System.Object[]
2014-02-21 2:02:56 PM Writing Lines Compare Report
2014-02-21 2:02:56 PM Differences
2014-02-21 2:02:56 PM Compare Objects End
.....
2014-02-21 2:03:31 PM Reading File 1
2014-02-21 2:03:32 PM Loading File 1 to Dictionary
2014-02-21 2:03:58 PM Reading File 2
2014-02-21 2:03:59 PM Loading File 2 to Dictionary
2014-02-21 2:04:25 PM Lines Compare
*** The value of comp variable is: @{InputKey=AD.CRW.PRDHOT07Y05; SideIndicator=<>}
*** The length of comp is:
*** The type is: System.Management.Automation.PSCustomObject
2014-02-21 2:04:25 PM Writing Lines Compare Report
2014-02-21 2:04:25 PM Differences
2014-02-21 2:04:25 PM Compare Objects End
Windows PowerShell Transcript End
End time: 20140221140438
**********************