36

将哈希表传递给我的 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 用于扩展默认选项(合并和覆盖默认值)的相同模式。

4

2 回答 2

35

不要使用括号和逗号。这是 PowerShell(例如,参数类似于 CMD 中命令的参数)。也就是说,像这样调用你的函数:

ExtendHash $hash1 $hash2

在您的情况下,表达式($hash1,$hash2)是一个包含两项的数组,您将此数组(一个参数)传递给函数。这样的调用正确地失败了。


如果您使用Set-StrictMode -Version 2,那么这个“常见”错误会被 PowerShell 捕获:

函数或命令被当作方法调用。参数应该用空格分隔。有关参数的信息,请参阅 about_Parameters 帮助主题。

于 2012-10-17T09:36:06.000 回答
7

(在Roman 的回答旁边:)
调用者不需要将哈希表存储在变量中,然后也可以使用它:

ExtendHash  -source @{One = 1; Two = 2}  -extender @{Two = 22; three = 3}

-source并且-extender是必要的,因此哈希表本身不会被解释为 arg-value-pairs for ExtendHash

于 2018-08-22T07:09:44.150 回答