我有这个:
$str = "name = username`nemail = user@example.com"
哪个是LF
分隔的字符串,作为INI文件的一部分。我想创建关联数组,以便例如$vars['name']
将返回'username'
。这就是我把它分成几行的方法:
$vars = ([regex]'\n').Split($str) | %{ $_.Trim() }
我应该对上面的行做出什么改变?
答案 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"