如何将哈希表转换为字符串数组?
假设$ l_table是一个哈希表。如果我尝试
$l_array = $l_table | format-table
那么$ l_array是一个数组,但是“FormatEntryData”对象的数组。
如果我做
[string[]]$l_array = $l_table | format-table
那么$ l_array是一个字符串数组,但是这些字符串都是“Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData”。如果我尝试
$l_array = $l_table | out-string
那么$ l_array是单个字符串。我已经尝试了许多其他方法,但是除了手动循环(我真的不想做)之外,没有任何效果。
最佳答案
David I. McIntosh's own answer运作良好,但应注意,结果数组的元素对应于默认输出的所有行,其中包括:
Out-String
只是将您通常在控制台(终端)中看到的内容发送给一个字符串,默认情况下为单个字符串,并且-Stream
作为字符串数组。这是David命令的变体,它删除了 header 和空行:
[string[]] $l_array = ($l_table | Out-String -Stream) -ne '' | select -Skip 2
该答案的其余部分显示如何控制获得的字符串表示形式的细节;为了简洁起见,它使用PS v3 +语法和内置别名
%
表示ForEach-Object
。注意:为了清楚起见,在下面的示例中,示例输入哈希表称为
$ht
(不是$l_table
)。 PSv4 + .ForEach()
变体的效果更好。 $ht.Keys | % ToString # or (PSv4+): $ht.Keys.ForEach('ToString')
$ht.Values | % ToString # or (PSv4+): $ht.Values.ForEach('ToString')
<key>=<value>
格式获取键值对的自定义表示;请注意,需要.GetEnumerator()
才能通过管道分别发送键值对;默认情况下,PowerShell作为一个整体传递哈希表: $ht.GetEnumerator() | % { "$($_.Name)=$($_.Value)" }
# or (PSv4+):
$ht.GetEnumerator().ForEach({ "$($_.Name)=$($_.Value)" })
请注意,虽然
.ToString()
(在字符串插值期间也隐式应用)(在"..."
内部,可扩展字符串),但与primitive .NET类型(以及其他数字类型,例如[decimal]
和[bigint]
)配合使用时效果很好;通常,类型将只打印其完整类型名称,除非显式覆盖了它们的.ToString()
方法以返回更有意义的自定义表示(这是原始类型的作用,并且只有某些PowerShell返回的非原始类型才是这种情况) cmdlet)。还要注意,在可扩展字符串中使用数组(类似数据结构)会将其元素与
$OFS
首选项变量的值(默认为空格char)串联(字符串化)。 (例如$a='one', 'two'; "$a"
扩展为'one two'
)-有关PowerShell中可扩展字符串(字符串插值)的更多信息,请参见this answer。选择一个值的属性以在字符串中表示它的简单示例:
# Sample hashtable containing a value of a non-built-in type,
# [System.Diagnostics.Process]
$ht = @{ one = 1; two = Get-Process -ID $PID }
# Use the `.Path` property to represent the value.
$ht.GetEnumerator() | % { "$($_.Name)=$($_.Value.Path)" }
关于powershell - 将哈希表转换为字符串数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21413483/