在 PowerShell 中快速将文件保存到哈希表

问题描述 投票:0回答:4

给定一个键值对数组(例如通过 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
来解决的,因此不需要任何数组到哈希表的转换。更新了问题标题以匹配该标题。

arrays powershell hashmap hashtable
4个回答
5
投票

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

2
投票

我通常执行以下操作从键/值对列表创建哈希表:

$hash = @{}
Get-Content 'C:\input.txt' | Where-Object {
  $_ -like '*=*'
} | ForEach-Object {
  $key, $value = $_ -split '\s*=\s*', 2
  $hash[$key] = $value
}

0
投票

可能不是您正在寻找的东西,但它避免了将整个内容转换为散列。

$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 匹配。


0
投票

@alroc 感谢分享 - 帮助我找到了我想要的东西。非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.