【问题标题】:How to define named parameter as [ref] in PowerShell如何在 PowerShell 中将命名参数定义为 [ref]
【发布时间】:2015-04-13 01:28:55
【问题描述】:

我正在尝试使用[ref] 命名参数。但是,我收到一个错误:

workflow Test
{
    Param([Parameter(Mandatory=$true)][String][ref]$someString)

    write-verbose $someString -Verbose
    $someString = "this is the new string"
}

cls
$someString = "hi"
Test -someString [ref]$someString
write-host $someString

#Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument.

我该如何解决这个问题?

【问题讨论】:

    标签: powershell powershell-workflow


    【解决方案1】:

    我注意到您在 [ref] 参数的示例中使用了“工作流程”。 为简单起见,我们将其称为“函数”,稍后再回到“工作流程”。

    您需要在代码中更改三件事:

    1. 将[ref]参数传递给函数时,需要将参数括在括号()中。
    2. 在函数中使用 [ref] 参数时,请参阅 $variable.value
    3. 从参数定义中删除 [string] 类型。它可以是 [string] 或 [ref],但不能同时是两者。

    这是有效的代码:

    function Test
    {
        Param([Parameter(Mandatory=$true)][ref]$someString)
    
        write-verbose $someString.value -Verbose
        $someString.value = "this is the new string"
    }
    cls
    $someString = "hi"
    Test -someString ([ref]$someString)
    write-host $someString
    

    至于“工作流程”。它们非常受限制,请阅读PowerShell Workflows: Restrictions。特别是,您不能在工作流中调用对象上的方法。这将打破界限:

    $someString.value = "this is the new string"
    

    由于工作流程的限制,我认为在工作流程中使用 [ref] 参数并不实用。

    【讨论】:

    • 这并不能真正回答我的问题,因为它只适用于函数,而不适用于工作流。
    【解决方案2】:

    我觉得我需要编写这个互补的非常简单的答案,因为这是在搜索有关在 Powershell 函数中使用参考参数的信息时,谷歌第一次点击。虽然您的问题不是关于功能,而是关于工作流程:

    在函数中使用引用参数的示例(不适用于工作流):

    Function myFunction ([ref]$aString) {
        $aString.Value = "newValue";
    }
    $localVariable = "oldValue"
    Write-Host $localVariable # Outputs: oldValue
    myFunction ([ref]$localVariable);
    Write-Host $localVariable # Outputs: newValue
    

    使用函数,您可以将参数定义为引用和另一种类型,如下所示(但不适用于工作流):

    Function myFunction ([ref][string]$aString) {
        $aString.Value = "newValue";
    }
    $localVariable = "oldValue"
    Write-Host $localVariable # Outputs: oldValue
    myFunction ([ref]$localVariable);
    Write-Host $localVariable # Outputs: newValue
    

    我同意 Jan 的观点,由于工作流限制(对象上的方法调用),您不应该尝试在工作流中使用引用参数:https://blogs.technet.microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions/

    【讨论】:

    • 为什么每行末尾都有<br>?
    • 不知道他们是如何到达那里的。我删除了它们。
    猜你喜欢
    • 2018-11-11
    • 2022-01-04
    • 2022-07-21
    • 2010-10-01
    • 1970-01-01
    • 2013-05-26
    • 2021-05-13
    • 2021-01-08
    • 2022-07-06
    相关资源
    最近更新 更多