【问题标题】:How do you pass a hash table to a function in PowerShell?如何将哈希表传递给 PowerShell 中的函数?
【发布时间】:2012-10-07 12:25:27
【问题描述】:

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

【问题讨论】:

  • 对于您的哈希表,您不应该使用分号而不是逗号 - 即。 @{One = 1, Two = 2} 应该是 @{One = 1;二 = 2}

标签: powershell hashtable


【解决方案1】:

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

ExtendHash $hash1 $hash2

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


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

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

【讨论】:

  • 让我有点恼火的是,powershell 有两种与类似事物直接相反的不同语法,即foo.SomeThing(a, b)Some-Thing a b
  • PowerShell 首先是一个外壳。那么它也是一种编程语言。此订单是设计使然。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多