【问题标题】:Hashtable with multiple values in GridViewGridView 中具有多个值的哈希表
【发布时间】:2016-09-28 09:29:09
【问题描述】:

我将数据存储在具有多个值的哈希表中,如下所示:

$hash = @{}
$folders = dir (...) | where (...)
foreach ($folder in $folders) {
    $num1 = (...)
    $num2 = (...)
    $hash.Add($folder.Name,@($num1,$num2))
}

所以这是一个哈希值,其值部分包含一个数组。数组总是有两个项目。完成foreach 部分后,我想用Out-GridView 显示数据,如下所示:

$hash | select -Property @{Expression={$_.Name};Label="FolderName"},
    @{Expression={$_.Name[0]};Label="num1"},
    @{Expression={$_.Name[1]};Label="num2"} | Out-GridView

但您可以想象,这是行不通的。如何将哈希值部分中存储的数组拆分为两个新列,以在 GridView 的三个列中显示它们?

应该类似于 Name, Value1, Value2 ...

然后将多个项目作为多行存储在哈希表中。

【问题讨论】:

    标签: powershell gridview hashtable


    【解决方案1】:

    哈希表不是具有NameValue 属性的对象列表。为了方便起见,PowerShell 就是这样显示数据结构的。要按照您尝试的方式处理哈希表,您需要一个枚举器来生成此类对象:

    $hash.GetEnumerator() |
        Select-Object @{n='FolderName';e={$_.Name}},
                      @{n='num1';e={$_.Value[0]}},
                      @{n='num2';e={$_.Value[1]}} |
        Out-GridView
    

    或者你可以枚举哈希表的键,将它们用作管道中的当前对象,并通过各自的键和索引查找值:

    $hash.Keys |
        Select-Object @{n='FolderName';e={$_}},
                      @{n='num1';e={$hash[$_][0]}},
                      @{n='num2';e={$hash[$_][1]}} |
        Out-GridView
    

    如果您事先不知道数组元素的数量,则需要一个内部循环来处理嵌套数组,例如像这样:

    $hash.Keys | ForEach-Object {
      $o = New-Object -Type PSObject -Property @{ 'FolderName' = $_ }
      $a = $hash[$_]
      for ($i = 1; $i -le $a.Count; $i++) {
        $o | Add-Member -Type NoteProperty -Name "num$i" -Value $a[$i-1]
      }
      $o
    } | Out-GridView
    

    如果您有可变数量的数组元素,请注意 PowerShell 通过第一个对象确定将显示哪些属性。

    【讨论】:

    • 此解决方案运行良好,但没有提供有关 Hamstibamsti 解决方案为何不起作用的信息。您应该详细说明为什么没有名为“Name”的属性,并且他可以使用 get-member cmdlet 检查 $hash 的属性。
    • 感谢您的帮助。汤姆是对的,在您的第二种方法中,您在枚举哈希表的键时使用$hash[$_][0]。为什么这在我的方法中不起作用?当我尝试时,它甚至无法正常工作:$hash.Keys | select $hash[$_][0]。为什么你的方法仍然有效?区别在哪里?在我看来,这是同一段代码?
    • @Hamstibamsti $_.Name[0] != $hash[$_][0]$_.Name[0] 即使你在枚举任何东西(你不是)也不可能工作,因为名称(键)首先不是一个数组。此外,$hash[$_][0] 不是键属性的名称,因此如果要与Select-Object 一起使用,则必须使用计算属性。
    • 再次感谢,所以Select-Object 中的@{Expression=(...) 数据转换负责使其工作?
    • “计算属性是对象的属性,但不是固有的内置属性。相反,它是我们自己创建的属性。”谢谢!
    猜你喜欢
    • 2015-07-26
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多