将Hashtable转换为一串键值对

时间:2014-09-24 03:40:40

标签: powershell

我有一个带计数的文件扩展名哈希表

像这样:

$FileExtensions = @{".foo"=4;".bar"=5}

Function HashConvertTo-String($ht) {
 foreach($pair in $ht.GetEnumerator()) {
 $output+=$pair.key + "=" + $pair.Value + ";"
 }

 $output
}


$hashString = HashConvertTo-String($FileExtensions)

$hashString.TrimEnd(';') -eq ".foo=4;.bar=5"

最后一行应返回$ true

这可行,但寻找更优雅的方式(删除尾随;是可选的)

我想我真正想要的是哈希表或类似的东西

思想???

2 个答案:

答案 0 :(得分:25)

PowerShell不会自动枚举哈希表,因此您被迫调用GetEnumerator()Keys属性。之后,有几个选择。首先,使用$OFS Ouptut Field Seperator。将数组转换为字符串时使用此字符串。默认情况下,这是"",但您可以更改它:

$FileExtensions = @{".foo"=4;".bar"=5}
$OFS =';'
[string]($FileExtensions.GetEnumerator() | % { "$($_.Key)=$($_.Value)" })

接下来使用-join运算符:

$FileExtensions = @{".foo"=4;".bar"=5}
($FileExtensions.GetEnumerator() | % { "$($_.Key)=$($_.Value)" }) -join ';'

答案 1 :(得分:0)

未经测试,但此代码应该有效:

Function HashConvertTo-String($ht) { 
  $first = $true
  foreach($pair in $ht.GetEnumerator()) { 
    if ($first) 
    {
       $first = $false
    } 
    else 
    {
       $output += ';'
    }
    $output+="{0}={1}" -f $($pair.key),$($pair.Value)
   } 
   $output
  }