【问题标题】:Quick File to Hashtable in PowerShell在 PowerShell 中快速文件到哈希表
【发布时间】:2014-08-18 14:08:59
【问题描述】:

给定一个键值对数组(例如通过 ConvertFrom-StringData 读取),是否有一种简化的方法可以将其转换为 Hashtable 或类似的以允许快速查找? 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 来解决这个问题,因此不需要任何数组到哈希表的转换。更新了问题标题以匹配它。

【问题讨论】:

  • 所以,等等,我很困惑...... 完全按照您对 $names 所做的操作,然后只是执行 $names.'10.0.0.2' 以获得所需的输出有什么问题?
  • @TheMadTechnician 语法错误,因为 $names 最终是一个单值哈希表数组,而不是一个哈希表。

标签: arrays powershell hashmap hashtable


【解决方案1】:

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
}

【讨论】:

    【解决方案3】:

    可能不是你要找的,但它避免了将整个东西转换成散列。

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

    【讨论】:

    • 对不起,没有。基本上我所追求的是如何从文件中获取第 1 行右侧的内容。在这里,您已将其硬编码到脚本中,但我需要从文件中读取它。我可以使用 ConvertFrom-StringData 轻松做到这一点,但问题是我最终得到了一个数组,我想要一个哈希表,这样我就可以进行直接查找,而不必每次都遍历它。我当然可以自己循环遍历数组并构建表格,但我认为这应该是一个非常常见的事情,希望已经通过内置的东西解决了。
    • 我只是硬编码它以简化我自己的测试。将该行替换为$content = get-content .\data.txt,您将得到相同的数组。
    • 哦!不知道创建哈希表和数组的语法这么相似,呵呵。我的错!
    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多