【问题标题】:Powershell: Unable to search imported hashtablePowershell:无法搜索导入的哈希表
【发布时间】:2018-05-25 05:42:29
【问题描述】:

我是 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

不过,我的搜索脚本仍然没有结果。

【问题讨论】:

  • $keys$csv 是什么?
  • Import-Csv 返回一个PSCustomObject 类型,它不是哈希表。
  • 用于从文件创建图层的代码什么也不做。使用Import-Csv的输出就足够了。
  • 不是 __ $t | ?{$_.Key -like 'Cal'}__ 有效吗?
  • @EBGreen ` 是代码分隔符。

标签: powershell


【解决方案1】:

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

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

您无需创建HashTable

【讨论】:

  • 如果出于任何原因要将结果转换为HashTable,可以使用$hash = @{}; $layers | % {$hash[$_.Key]=$_.Value},然后在哈希表中搜索,需要使用$hash.getEnumerator()...
【解决方案2】:

因此,在您当前的迭代中,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]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2014-04-07
    • 2018-01-22
    • 2012-10-12
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多