【问题标题】:Object within a hashtable哈希表中的对象
【发布时间】:2013-10-29 14:16:21
【问题描述】:

我正在尝试将对象放入哈希表中。我没有收到错误,但无法访问数据。

$Level1Hashtable = @{}
$Level2Object = New-Object System.Object
$Level2Object | Add-Member -MemberType NoteProperty -Name Name -Value "abc"
$Level2Object | Add-Member -MemberType NoteProperty -Name IpAddress -Value "192.168.1.1"
$Level1Hashtable.Add("Test1",$Level2Object)
$Level2Object = New-Object System.Object
$Level2Object | Add-Member -MemberType NoteProperty -Name Name -Value "123"
$Level2Object | Add-Member -MemberType NoteProperty -Name IpAddress -Value "192.168.1.1"
$Level1Hashtable.Add("Test2",$Level2Object)

$Level1Hashtable.Test1.IpAddress

【问题讨论】:

    标签: object powershell hashtable


    【解决方案1】:

    这对我使用 V4 有效。在 V2 中运行它不起作用,但是如果我从使用 System.Object 切换到 PSObject 作为 New-Object cmdlet 中的对象类型。

    $Level1Hashtable = @{}
    $Level2Object = New-Object PSObject
    $Level2Object | Add-Member -MemberType NoteProperty -Name Name -Value "abc"
    $Level2Object | Add-Member -MemberType NoteProperty -Name IpAddress -Value "192.168.1.1"
    $Level1Hashtable.Add("Test1",$Level2Object)
    $Level2Object = New-Object PSObject
    $Level2Object | Add-Member -MemberType NoteProperty -Name Name -Value "123"
    $Level2Object | Add-Member -MemberType NoteProperty -Name IpAddress -Value "192.168.1.1"
    $Level1Hashtable.Add("Test2",$Level2Object)
    
    $Level1Hashtable.Test1.IpAddress
    

    【讨论】:

      【解决方案2】:

      根据您使用的 PowerShell 版本,Add-Member 有一个问题(v1 和可能是 v2),您必须使用 -PassThru 并重新分配给原始对象,例如:

      $Level2Object = $Level2Object | Add-Member NoteProperty Name abc -PassThru
      

      在 V3 中,您可以像这样更简单地创建它:

      $Level2Object = [pscustomobject]@{Name='abc';IpAddress='192.168.1.1'}
      

      在 V2 中,您也可以在 new-object 上使用 Property 参数来简化:

      $Level2Object = new-object psobject -property @{Name='abc';IpAddress='192.168.1.1'}
      

      【讨论】:

        【解决方案3】:

        这种冗余的实例化并没有给我留下深刻印象,所以我走了一条稍微不同的路线:

        $Servers =
        @{
            "DC1" = [pscustomobject]@{ FQDN = "dc1.ad.foobar.com"; IpAddress = "192.168.2.1"}
            "DC2" = [pscustomobject]@{ FQDN = "dc2.ad.foobar.com"; IpAddress = "192.168.2.2"}
            "STS" = [pscustomobject]@{ FQDN = "sts.ad.foobar.com"; IpAddress = "192.168.2.3"}
        }
        

        那么你也可以很容易地访问元素:

        Servers["DC1"].IpAddress = "192.168.2.4"
        

        在 PowerShell Core(又名 PowerShell 6)上进行测试,效果非常棒。干杯。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-21
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-16
          • 2013-01-31
          • 2015-10-26
          相关资源
          最近更新 更多