【问题标题】:Splatting after passing hashtable by reference in Powershell在Powershell中通过引用传递哈希表后飞溅
【发布时间】:2012-11-11 10:56:45
【问题描述】:

当我通过引用一个函数来传递一个哈希表时,我遇到了一个障碍。我该如何解决这个问题?

Function AllMyChildren {
    param (
        [ref]$ReferenceToHash
    }
    get-childitem @ReferenceToHash.Value
    #  etc.etc.
}
$MyHash = @{
    'path' = '*'
    'include' = '*.ps1'
    'name' = $null
}
AllMyChildren ([ref]$MyHash)

结果:错误(“Splatted 变量不能用作属性或数组表达式的一部分。将表达式的结果分配给临时变量,然后改为 splat 临时变量。”)。

尝试这样做:

$newVariable = $ReferenceToHash.Value
get-childitem @NewVariable

这确实有效,并且根据错误消息似乎是正确的。在这种情况下是 preferred 语法吗?

【问题讨论】:

    标签: powershell hashtable pass-by-reference


    【解决方案1】:

    1) 使用[ref] 传递哈希表(或任何类的实例,即引用类型)是没有意义的,因为它们本身总是通过引用传递。 [ref] 与值类型(标量和结构实例)一起使用。

    2) splatting 运算符可以直接应用于变量,而不是表达式。

    因此,为了解决问题,只需在函数中传递哈希表即可:

    Function AllMyChildren {
        param (
            [hashtable]$ReferenceToHash # it is a reference itself
        )
        get-childitem @ReferenceToHash
        #  etc.etc.
    }
    $MyHash = @{
        'path' = '*'
        'include' = '*.ps1'
        'name' = $null
    }
    AllMyChildren $MyHash
    

    【讨论】:

    • 非常感谢。我在考虑 Perl-ish(而不是.Net-ish--需要学习很多东西)。通过引用明确地传递某些东西,却又不得不复制它,这似乎很奇怪。很高兴听到它比我想象的要简单得多。
    猜你喜欢
    • 2012-11-05
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2015-12-23
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多