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