Powershell:无法搜索导入的哈希表

时间:2017-12-11 16:36:23

标签: powershell

我是Powershell的新手,这种行为令我感到难过。

假设我已经创建了一个包含以下信息的哈希表:

$hash= @{
California = 'Sacramento';
Washington = 'Olympia';
Oregon = 'Salem';
Alaska = 'Juneau';
}
$hash

现在我想使用where -match语句搜索特定键:

$result = @($layers.getEnumerator() | ? {$_.key -match 'Cal'})
$result

这将返回加利福尼亚州的钥匙和萨克拉门托的价值。一切正常。

现在,不是输入表的键和值,而是说我想使用CSV文件将它们导入哈希表:

California,Sacramento
Washington,Olympia
Oregon,Salem
Alaska,Junea

这是我创建的用于导入CSV的代码,工作正常:

Import-Csv C:\Users\hgordon\Desktop\Maps_to_search\junk.csv -Header "Key","Value"
$layers = @{}
Foreach ($key in $keys) {
    $layers[$key] = $csv 
}

我的问题是,当我在上面运行我的搜索语句时,它什么都不返回。

为什么搜索不能在导入的哈希表上运行?我需要用import语句修改一些东西吗?导入的哈希表与手动键入的哈希表之间有什么区别?

谢谢!

编辑:我已按如下方式编辑了我的导入脚本,以便更清楚:

$t = Import-Csv -Path C:\Users\hgordon\Desktop\Maps_to_search\junk.csv -Header "Key","Value"
$HashTable = @{}
foreach($r in $t)
{
    #Write-Host $r.column1 $r.column2
    $HashTable[$r.Key] = $r.Value
}
$HashTable

但我的搜索脚本仍然没有结果。

2 个答案:

答案 0 :(得分:1)

要完成工作,您只需要获取Import-Csv的输出并以这种方式使用它:

$layers = Import-Csv "C:\yourfile.csv" -Header "Key","Value"
$result = @($layers | ? {$_.Key -match 'Cal'})
$result

您无需创建HashTable

答案 1 :(得分:1)

因此,在您当前的迭代中,Import-Csv正在将CSV导入为PSCustomObject类型。您的Key / Value标题用于在对象上创建属性,每个CSV下都有一个数组,因此您最终得到:

key        value
---        -----
California Sacramento
Washington Olympia
Oregon     Salem
Alaska     Junea 
TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
key         NoteProperty string key=California
value       NoteProperty string value=Sacramento

要根据此信息构建您自己的哈希表,您需要自己合并:

$HT = @{}
$Csv = Import-Csv ... -Header 'Keys','Values'

For ($i = 0; $i -lt $Csv.Keys.Count; $i++)
{
    ## Here we're using array-accessors
    $HT[$Csv.Keys[$i]] = $Csv.Values[$i]
    #alternative
    #$HT.($Csv.Keys[$i]) = $Csv.Values[$i]
}