使用哈希表将产品代码映射到型号名称时遇到麻烦:
$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
。
为什么它不能检索我刚刚添加的项目?抱歉,我知道这是超级基础,但是我无法终生解决。
答案 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)