【问题标题】:powershell psobject getenumerator onepowershell psobject getenumerator 一
【发布时间】:2014-02-27 20:19:33
【问题描述】:

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    Get-Enumerator 是一个数组方法。如果函数只返回一个对象,则不会得到数组,因此该方法不起作用。这是正常的预期行为。

    您可以修改函数以始终返回一个数组,但这是一种非标准方法。您希望该函数的行为尽可能与其他 cmdlet 和函数相似。最好在主脚本中将其强制放入函数外部的数组中:

    $comp = @(result)
    

    【讨论】:

    • 对,这也有效,这实际上是我的第一个答案,但后来决定只更改他提供的代码......关于为什么总是将值作为数组返回的任何信息都是非-标准方法?只是好奇
    • 它是非标准的,因为它会产生意想不到的行为。如果返回多个对象,我希望只获得一个数组,因为这就是我能想到的所有其他 cmdlet 或函数的工作方式(恕我直言)。
    • 但是您正在做同样的事情...始终确保它是一个数组,这在调用普通 PS cmdlet 时不是必需的。我认为在函数级别更改它会更标准,因为函数是要被重用的,所以不管你怎么称呼它,它的行为方式都是一样的。但我想这只是我的看法
    • 实际上,我所做的在使用普通 PS cmdlet 时并不少见。你能命名任何将返回一个对象数组的 get-* cmdlet 吗?
    【解决方案2】:

    使用逗号运算符始终将值作为数组返回:

    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
    }
    

    【讨论】:

      【解决方案3】:

      好像$comp 是一个项目,它不是一个数组。您需要将$comp“初始化”为一个空数组。我在您的代码中看不到它来自哪里,但是这样的东西应该可以工作:

      #This creates an empty array
      $comp = @()
      $comp += $foo
      

      【讨论】:

        【解决方案4】:

        这些都是很好的答案。我将不得不尝试它们,看看我是否能理解它为什么有效以及为什么无效。我已经制定了一个蛮力解决方案,从 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
        **********************
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-08
          • 2022-01-06
          • 2016-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          相关资源
          最近更新 更多