如何将哈希表转换为字符串数组?
假设$ 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/

    10-14 18:50
    查看更多