给定一个键值对数组(例如通过 ConvertFrom-StringData 读入),是否有一种简化的方法将其转换为哈希表或类似的以允许快速查找? IE。一种不需要我循环遍历数组并自己手动构建哈希表的方法。
示例数据
10.0.0.1=alice.example.com
10.0.0.2=bob.example.com
使用示例
$names = gc .\data.txt | ConvertFrom-StringData
// $names is now Object[]
$map = ?
// $map should now be Hashtable or equivalent
echo $map['10.0.0.2']
// Output should be bob.example.com
基本上我正在寻找的是一个最好是内置的文件到哈希表的函数。或者数组到哈希表的函数。
注意:正如@mjolnior所解释的那样,我实际上得到了哈希表,但是一个单值数组。因此,这是通过读取文件
-raw
来解决的,因此不需要任何数组到哈希表的转换。更新了问题标题以匹配该标题。
Convertfrom-Stringdata 确实创建了一个哈希表。
您需要将键值对作为单个多行字符串(而不是字符串数组)提供
$map = Get-Content -raw .\data.txt | ConvertFrom-StringData
$map['10.0.0.2']
bob.example.com
当您使用不带 -Raw 开关的 Get-Content 时,您将向 ConvertFrom-StringData 提供一个单行字符串数组,它会返回一个单元素哈希表数组:
$map = Get-Content .\data.txt | ConvertFrom-StringData
$map.gettype()
$Map[0].GetType()
$map[0]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
True True Hashtable System.Object
Key : 10.0.0.1
Value : alice.example.com
Name : 10.0.0.1
我通常执行以下操作从键/值对列表创建哈希表:
$hash = @{}
Get-Content 'C:\input.txt' | Where-Object {
$_ -like '*=*'
} | ForEach-Object {
$key, $value = $_ -split '\s*=\s*', 2
$hash[$key] = $value
}
这可能不是您正在寻找的东西,但它避免了将整个内容转换为散列。
$content = @("10.0.0.1=alice.example.com","10.0.0.2=bob.example.com");
$content | ForEach-Object {
$keyval = $_.split("=");
if ($keyval[0] -eq "10.0.0.2") {
$keyval[1]
}
}
输出将是 = 右侧的每个值,其中左侧与该 IP 匹配。
@alroc 感谢分享 - 帮助我找到了我想要的东西。非常感谢!