27

我正在尝试使用[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.

我该如何解决这个问题?

4

2 回答 2

42

我注意到您在 [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] 参数并不实用。

于 2015-04-13T01:45:37.427 回答
5

我觉得我需要写这个互补的非常简单的答案,因为这是在搜索有关在 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 -限制/

于 2016-12-02T10:30:38.817 回答