如何创建一个关联数组,最好是一个单行?

时间:2014-07-03 07:44:04

标签: powershell

我有这个:

$str = "name = username`nemail = user@example.com"

哪个是LF分隔的字符串,作为INI文件的一部分。我想创建关联数组,以便例如$vars['name']将返回'username'。这就是我把它分成几行的方法:

$vars = ([regex]'\n').Split($str) | %{ $_.Trim() }

我应该对上面的行做出什么改变?

3 个答案:

答案 0 :(得分:6)

如果您是Powershell 4的幸运拥有者,那么可以使用ConvertFrom-StringData cmdlet:

$str = "name = username`nemail = user@example.com"
$vars = ConvertFrom-StringData $str

结果:

PS C:\> $vars

Name                           Value
----                           -----
name                           username
email                          user@example.com

答案 1 :(得分:4)

PeterK的答案的更多PoSh版本将如下所示:

$vars = @{}
$str.Trim() -split "\s*`n\s*" | % {
  $key, $value = $_ -split '\s*=\s*'
  $vars[$key] = $value
}

使用$vars[$key] = $value代替$vars.Add($key, $value)可以避免错误,如果您有重复的密钥。

您还可以将字符串拆分为交替键和值字段的数组,然后fill the hashtable from that array

$vars = @{}
$list = $str.Trim() -split "\s*`n\s*" -split '\s*=\s*'
while ($list) {
  $key, $value, $list = $list
  $vars[$key] = $value
}

通过用分号分隔语句,可以将每个示例分成一行:

$vars = @{}; $str.Trim() -split "\s*`n\s*" | % { $key, $value = $_ -split '\s*=\s*'; $vars[$key] = $value }
$vars = @{}; $list = $str.Trim() -split "\s*`n\s*" -split '\s*=\s*'; while ($list) { $key, $value, $list = $list; $vars[$key] = $value }

答案 2 :(得分:3)

它不是单行,但有一种方法是:

$hashtable = @{};
$key_value_pairs = $str.Split("`n");
foreach($key_value in $key_value_pairs)
{
    $key_value_pair = $key_value.Split('=');
    $hashtable.Add($key_value_pair[0].Trim(), $key_value_pair[1].Trim());
}

首先将输入字符串拆分为一个数组,每个项目在一行中包含一个键值对。对于每个键值对,我们将它们分成一个键#'和'价值' on" ="再次进入常规数组。键和值都被修剪并添加到哈希表中。完成此操作后,$hashtable["name"]将返回"用户名" $hashtable["email"]将返回" user@example.com"