Arrays PowerShell中哈希表的快速文件

Arrays PowerShell中哈希表的快速文件,arrays,powershell,hashmap,hashtable,Arrays,Powershell,Hashmap,Hashtable,给定一个键值对数组(例如,通过ConvertFromStringData读入),是否有一种简化的方法将其转换为哈希表或类似的格式,以允许快速查找?也就是说,一种不需要我自己循环数组并手动构建哈希表的方法 示例数据 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 = ? //

给定一个键值对数组(例如,通过ConvertFromStringData读入),是否有一种简化的方法将其转换为哈希表或类似的格式,以允许快速查找?也就是说,一种不需要我自己循环数组并手动构建哈希表的方法

示例数据

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
基本上,我想要的是一个内置的文件到哈希表的函数。或一个数组到哈希表函数


注意:如前所述,我实际上得到了哈希表,但却是一个单值的数组。因此,这是通过读取文件
-raw
修复的,因此不需要任何数组到哈希表的转换。更新了问题标题以匹配该标题。

这可能不是您要查找的内容,但它避免了将整个内容转换为哈希

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

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

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

Convertfrom Stringdata会创建一个哈希表

您需要将键值对作为单个多行字符串(而不是字符串数组)提供给它

在不使用-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

对不起,没有。基本上我想要的是如何从文件中获取第1行右侧的内容。在这里,您已将其硬编码到脚本中,但我需要从文件中读取它。例如,我可以用
ConvertFrom StringData
轻松地实现这一点,但问题是我最终得到的是一个数组,我想要一个哈希表,这样我就可以直接查找,而不必每次都循环它。我当然可以自己循环数组并构建表,但我认为这应该是一件非常常见的事情,希望已经通过内置的东西解决了。我只是硬编码了它以简化我自己的测试。将该行替换为
$content=get content.\data.txt
,您将得到相同的数组。噢!不知道创建哈希表和数组的语法是如此相似,呵呵。我的错!等等,我很困惑。。。完全按照使用
$names
所做的操作,然后只执行
$names.10.0.0.2'
以获得所需的输出,有什么不对?@TheMadTechnician语法错误,因为$names最终是一个单值哈希表数组,而不是一个哈希表。谢谢!这很有道理,而且完全奏效:)
$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