【问题标题】:Powershell hashtable with multiple values and one key具有多个值和一个键的 Powershell 哈希表
【发布时间】:2017-09-25 19:27:39
【问题描述】:

我正在寻找一种数据结构/cmdlet,它允许我向 Powershell 中的单个键添加多个值。

我的数据理想情况下应该是这样的:

键-------------- 值

HOSTNAME1------------DATABASE1,DATABASE2,DATABASE3

HOSTNAME2-------------DATABASE1,DATABASE2

等等……

我认为哈希表可以解决问题,但我无法执行以下操作:

$servObjects = @{}
$servObjects.Add("server1", @())
$servObjects.get_item("server1") += "database1"

当我尝试时,这会产生一个空数组:

$servObjects.get_item("server1")

我也尝试过以下操作,希望powershell能理解我想要的:

$servObjects2 = @{}
$servObjects2.add($servername, $databasename)

不幸的是,这会产生重复键异常

感谢您的所有意见

【问题讨论】:

    标签: powershell data-structures


    【解决方案1】:

    如果您将数据放在数组中,您可以对数组进行分组并转换为哈希表:

    $ary = @()
    $ary = $ary + [PSCustomObject]@{RowNumber = 1; EmployeeId = 1; Value = 1 }
    $ary = $ary + [PSCustomObject]@{RowNumber = 2; EmployeeId = 1; Value = 2 }
    $ary = $ary + [PSCustomObject]@{RowNumber = 3; EmployeeId = 2; Value = 3 }
    $ary = $ary + [PSCustomObject]@{RowNumber = 4; EmployeeId = 2; Value = 4 }
    $ary = $ary + [PSCustomObject]@{RowNumber = 5; EmployeeId = 3; Value = 5 }
    
    $ht = $ary | Group-Object -Property EmployeeId -AsHashTable
    

    $ht 是:

    Name Value
    ---- -----
    3    {@{RowNumber=5; EmployeeId=3; Value=5}}
    2    {@{RowNumber=3; EmployeeId=2; Value=3}, @{RowNumber=4; EmployeeId=2; Value=4}}
    1    {@{RowNumber=1; EmployeeId=1; Value=1}, @{RowNumber=2; EmployeeId=1; Value=2}}
    

    【讨论】:

      【解决方案2】:

      在你原来的例子中,而不是写

      $servObjects.get_item("server1") += "database1"
      

      你写过

      $servObjects.server1 += "database1"
      

      它会起作用的。

      我对 PowerShell 很陌生,但我更喜欢使用

      $servObjects.Add("key",@())
      

      结束

      $servObjects.key = @())
      

      因为如果键已经存在于哈希表中,.Add 将引发重复异常,而分配将用新条目替换现有条目。出于我的目的,我发现隐式替换是(通常不是)我的逻辑中的错误,或者需要处理的输入数据中的异常。

      【讨论】:

        【解决方案3】:

        您基本上需要一个包含数组值的哈希表。您不必使用$hashtable.get_item.add

        $myHashTable = @{} # creates hash table
        $myHashTable.Entry1 = @() #adds an array
        $myHashTable.Entry1 += "element1"
        $myHashTable.Entry1 += "element2"
        

        这会产生以下输出:

        $myHashTable
        
        Name                           Value                                                                                                                                                                                           
        ----                           -----                                                                                                                                                                                           
        Entry1                         {element1, element2}
        
        $myHashTable.Entry1
        element1
        element2
        

        【讨论】:

        • 我不会为此使用数组。将“@()”替换为[System.Collections.Generic.List[string]]::new()" 并使用$myHashTable.Entry1.Add('element1')
        【解决方案4】:

        如果你知道创建时的价值,这样会更清楚:

        [hashtable]$hash = @{
            HOSTNAME1 = @(DATABASE1, DATABASE2, DATABASE3);
            HOSTNAME2 = @(DATABASE1, DATABASE2);
        }
        

        这将为您带来以下内容:

        Name                           Value
        ----                           -----
        HOSTNAME2                      {DATABASE1, DATABASE2}
        HOSTNAME1                      {DATABASE1, DATABASE2, DATABASE3}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 2015-07-26
          • 2013-05-04
          • 2018-10-25
          • 1970-01-01
          • 2021-01-26
          • 2016-09-28
          相关资源
          最近更新 更多