如何在 PowerShell 中将命名参数定义为 [ref]
How to define named parameter as [ref] in PowerShell
我正在尝试使用 [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.
我该如何解决这个问题?
我注意到您在 [ref] 参数示例中使用了 "workflow"。
为简单起见,我们将其称为 "function",稍后返回 "workflow"。
您需要在代码中更改三处:
- 将[ref]参数传递给函数时,需要将参数括在括号
()
中。
- 在函数中使用 [ref] 参数时,请参考 $variable.value
- 从参数定义中删除 [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
至于"workflows"。它们非常受限,阅读 PowerShell Workflows: Restrictions。特别是您不能在工作流中的对象上调用方法。这将打破这一行:
$someString.value = "this is the new string"
由于工作流的限制,我认为在工作流中使用 [ref] 参数不切实际。
我觉得我需要写这个补充性的非常简单的答案,因为这是搜索有关在 Powershell 函数中使用引用参数的信息时的第一个 google 命中。虽然您的问题不是关于功能而是关于工作流程:
在函数中使用引用参数的示例(不适用于工作流):
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/
我正在尝试使用 [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.
我该如何解决这个问题?
我注意到您在 [ref] 参数示例中使用了 "workflow"。 为简单起见,我们将其称为 "function",稍后返回 "workflow"。
您需要在代码中更改三处:
- 将[ref]参数传递给函数时,需要将参数括在括号
()
中。 - 在函数中使用 [ref] 参数时,请参考 $variable.value
- 从参数定义中删除 [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
至于"workflows"。它们非常受限,阅读 PowerShell Workflows: Restrictions。特别是您不能在工作流中的对象上调用方法。这将打破这一行:
$someString.value = "this is the new string"
由于工作流的限制,我认为在工作流中使用 [ref] 参数不切实际。
我觉得我需要写这个补充性的非常简单的答案,因为这是搜索有关在 Powershell 函数中使用引用参数的信息时的第一个 google 命中。虽然您的问题不是关于功能而是关于工作流程:
在函数中使用引用参数的示例(不适用于工作流):
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/