如何将哈希表传递给PowerShell中的函数?

Sté*_*ane 31 powershell hashtable

将哈希表传递给我的PowerShell函数时,它会抱怨它收到一个对象.

Function ExtendHash(){
  param(
    [hashtable] $source,
    [hashtable] $extender
  )
  ...
}
Run Code Online (Sandbox Code Playgroud)

和来电者:

$hash1 = @{One = 1; Two = 2}
$hash2 = @{Two = 22; three = 3}
ExtendHash($hash1, $hash2)
Run Code Online (Sandbox Code Playgroud)

无法将System.Object []类型的System.Object []值转换为System.Collection.Hashtable类型

那我该怎么做呢?建议?

另外,我错过了内置的东西吗?我想要与JavaScript用于扩展默认选项(合并和覆盖默认值)相同的模式.

Rom*_*min 29

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

ExtendHash $hash1 $hash2
Run Code Online (Sandbox Code Playgroud)

在你的case中,expression ($hash1,$hash2)是一个包含两个项的数组,你将这个数组(一个参数)传递给函数.这样的呼叫失败了.


如果您使用,Set-StrictMode -Version 2则PowerShell会捕获此"常见"错误:

函数或命令被调用,就像它是一个方法一样.参数应以空格分隔.有关参数的信息,请参阅about_Parameters帮助主题.

  • PowerShell首先是一个shell.那么它也是一种编程语言.这个订单是设计的. (6认同)

And*_*ich 6

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

ExtendHash  -source @{One = 1; Two = 2}  -extender @{Two = 22; three = 3}
Run Code Online (Sandbox Code Playgroud)

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