虽然原始发帖人可能想要一个与 Format-Table 的输出相对应的字符串数组,但正如所提供的尝试和发帖人自己的答案/cmets 所暗示的那样,问题标题的措辞是更典型的是希望将哈希表本身转换为每个项目值的数组(如果还不是String,则转换为String)。对于那些寻求解决这个问题的人,我提出以下内容(因为似乎还没有类似的问题):-
简单的答案是使用
[string[]]$l_table.values
这确实会根据需要提供一个字符串数组。
注意:$l_table.values 是 [System.Collections.Hashtable+ValueCollection],这就是为什么即使值已经是字符串也需要转换为 [string[]] 的原因。例如,
'Found {0} with submatch {1}' -f [string[]]$matches.values
没有它就行不通。 (接下来会提到另一个可能的问题。)
$l_table.values 的主要缺陷是,除非哈希表被定义为 [ordered] (PSv3+),否则项目的顺序是未定义的(并且可以随着哈希表的修改而改变)。通常,在将哈希表转换为数组时,需要对该数组中的元素进行某种排序。实际上,有时键是(正)整数,其目的是生成的数组使用与数组索引相同的值(参见上面的$matches 示例)。要创建这种类型的数组,请使用
[string[]]$l_table[($l_table.keys | sort)]
或者,如果值已经是字符串,则只是
$l_table[($l_table.keys | sort)]
调用 Powershell 的集合切片功能(通过使用数组表达式作为索引,单个表达式可以生成一组独立选择的集合项。例如,$array[1,3,5,9]、$array[1,2,3,4,5] 或 $array[1..5])。请注意,如果键形成从 0 开始的连续范围,这只会生成一个以键作为索引的数组。但是,由于索引表达式是一个管道,因此可以获得几乎任何东西作为所需的键数组。要从“稀疏”哈希表(非字符串值)中获取结果数组,请使用
[string[]]$l_table[0..($l_table.keys | sort -descending)[0]]
#
# ($l_table.keys | sort -descending) produces a sorted array of key values
# with the largest value in element 0
#
现在,通过将任何中间(未使用)数组项设置为“”(即[string]$null),结果数组将具有正确对应于适当索引值的整数键。如果这是一个问题,那么可以使用两步过程来留下“缺失”的条目
作为$null。首先,通过一次一个字典对构建一个新的哈希表(使用GetEnumerator()),将非字符串哈希表转换为字符串而不添加条目。其次,在将(现在的字符串)哈希表转换为数组时,不要使用[string[]],以便将$null留在“未使用”项中,如下所示
($l_table.getenumerator() | foreach -begin {$str_table = @{}} -process {$str_table.add($_.key,[string]$_.value)} -end {$str_table[0..($str_table.keys | sort -descending)[0]]})
或者可能更有效(通过删除可能成本高昂的排序)
($l_table.getenumerator() | foreach -begin {$maxkey = 0; $str_table = @{}} -process {$str_table.add($_.key,[string]$_.value); if ($maxkey -lt $_.key){$maxkey = $_.key}} -end {$str_table[0..$maxkey]})
注意:对于字符串值的稀疏散列表,初始形式无需转换
$l_table[0..($l_table.keys | sort -descending)[0]]
可以,但如果需要,使用 [string[]] 会将任何缺失的条目从 $null 更改为 ""。