powershell psobject getenumerator one

时间:2014-02-21 15:53:34

标签: powershell

我借用了一些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技能来说有点先进。有关如何防止对象中一个项目出错的任何建议吗?

4 个答案:

答案 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
**********************