将哈希表传递给我的PowerShell函数时,它会抱怨它收到一个对象。
Function ExtendHash(){
param(
[hashtable] $source,
[hashtable] $extender
)
...
}
来电者:
$hash1 = @{One = 1; Two = 2}
$hash2 = @{Two = 22; three = 3}
ExtendHash($hash1, $hash2)
无法将System.Object []类型的System.Object []值转换为System.Collection.Hashtable类型
那我该怎么做呢?建议?
另外,我错过了内置的东西吗?我想要与JavaScript用于扩展默认选项的模式相同(合并和覆盖默认值)。
答案 0 :(得分:27)
不要使用括号和逗号。这是PowerShell(比如,参数类似于CMD中的命令参数)。也就是说,像这样调用你的函数:
ExtendHash $hash1 $hash2
在你的情况下,表达式($hash1,$hash2)
是一个包含两个项的数组,你将这个数组(一个参数)传递给函数。这样的呼叫失败了。
如果您使用Set-StrictMode -Version 2
,那么PowerShell会抓住这个“常见”错误:
调用函数或命令就好像它是一个方法一样。参数 应该用空格分隔。有关参数的信息,请参阅 about_Parameters帮助主题。
答案 1 :(得分:3)
(Roman's answer旁边:)
调用者不需要将哈希表存储在变量中,然后调用者也可以使用此变量:
ExtendHash -source @{One = 1; Two = 2} -extender @{Two = 22; three = 3}
({-source
和-extender
是必需的,因此对于ExtendHash
,哈希表本身不会被解释为arg-value-pairs)