Powershell哈希表检索故障

时间:2018-09-12 20:04:51

标签: powershell hashtable

使用哈希表将产品代码映射到型号名称时遇到麻烦:

$modelList = @{}

$key = 48525748
$value = "Dell P2217"
$modelList[$key] = $model

$key = 65486855
$value = "Dell P2217"
$modelList[$key] = $model


$key = 65486856
$value = "Dell P2217"
$modelList[$key] = $model

$key = 51505066
$value = "HP 22-incher"
$modelList[$key] = $model

write-host WHYYYY:  $modelList[51505066]
write-host WHYY: $modelList.Get_Item(51505056)

上面写的全部是WHY
为什么它不能检索我刚刚添加的项目?抱歉,我知道这是超级基础,但是我无法终生解决。

2 个答案:

答案 0 :(得分:2)

您似乎只是想将$value而不是$model分配给您的哈希表条目,这将解释为什么您没有输出(未初始化的变量是隐式{在PowerShell中默认为{1}}。
检测此类问题的一种方法是,如果尝试获取未初始化变量的值,则通过设置Set-StrictMode -Version 1 <来使PowerShell报告错误 。 / strong>或更高版本。


但是,在您的情况下考虑使用哈希表 literal ,这样就完全不需要使用变量了:

$null

也可以单行定义它,在这种情况下,您必须使用$modelList = @{ 48525748 = "Dell P2217" 65486855 = "Dell P2218" 65486856 = "Dell P2219" 51505066 = "HP 22-incher" } $modelList[51505066] # -> 'HP 22-incher'

分隔条目
;

根据 访问哈希表的条目,您有两种语法选择(除了调用参数化的$modelList = @{ 48525748 = "Dell P2217"; 65486855 = "Dell P2217"; 65486856 = "Dell P2217"; 51505066 = "HP 22-incher" } 属性/ .Item()方法):

  • 索引符号:.get_Item()

  • 点表示法(与对象一样):$modelList[51505066]

但是,有细微的差异-见下文。

注意事项

  • 您正在使用数字作为键,其具体类型为$modelList.51505066[int]),PowerShell自动选择了该类型根据这些值。

    • 虽然将数字用作键在原理上效果很好,但如果数字类型与System.Int32相比不同,则可能需要使用显式强制转换以便访问此类条目

      [int]
  • 要使用 string 键,请引用 ,例如$ht = @{ 10L = 'ten' } # suffix 'L' makes the number a [long] (System.Int64) $ht[10] # !! FAILS, because 10 is an [int], so the key is not found. $ht[[long] 10] # OK - explicit cast matches the key's actual type

    • 索引符号始终要求引用以访问 string 键:
      '65486855'

    • 相反,如果点符号看起来像为数字(如果将它们解析为数字作为未加引号的标记),则点号仅需要引用字符串键:

      $ht['65486855']

答案 1 :(得分:0)

如@ mklement0所述,您正在为每个键的值分配一个未分配的变量($null)。您只需将$model替换为$value

注意:您在Get_Item()呼叫中还引用了不存在的密钥。

解决方案

$modelList = @{}

$key = 48525748
$value = "Dell P2217"
$modelList[$key] = $value

$key = 65486855
$value = "Dell P2217"
$modelList[$key] = $value


$key = 65486856
$value = "Dell P2217"
$modelList[$key] = $value

$key = 51505066
$value = "HP 22-incher"
$modelList[$key] = $value

write-host WHYYYY:  $modelList[51505066]
write-host WHYY: $modelList.Get_Item(51505066)