Как определить именованный параметр как [ref] в PowerShell

Я пытаюсь использовать параметры [ref] named. Однако я получаю сообщение об ошибке:

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.

Как я могу исправить эту проблему?

Ответ 1

Я заметил, что вы используете "рабочий процесс" в вашем примере параметра [ref]. Для простоты, давайте назовем это "функцией" и вернемся к "рабочему процессу" позже.

В коде нужно изменить три вещи:

  1. При передаче параметра [ref] в функцию необходимо заключить параметр в круглые скобки ().
  2. При использовании параметра [ref] внутри функции обращайтесь к $ variable.value
  3. Удалите тип [string] из определения вашего параметра. Это может быть [строка] или [ссылка], но не оба одновременно.

Вот код, который работает:

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: ограничения. В частности, вы не можете вызвать метод для объекта в рабочем процессе. Это нарушит черту:

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

Я не думаю, что использование параметров [ref] в рабочем процессе целесообразно из-за ограничений рабочего процесса.

Ответ 2

Я чувствовал, что мне нужно было написать этот дополнительный очень упрощенный ответ, так как это было первое попадание Google при поиске информации об использовании ссылочных параметров в функциях 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

Я согласен с Яном, вы не должны пытаться использовать ссылочные параметры в рабочих процессах из-за ограничений рабочего процесса (вызов метода для объектов): https://blogs.technet.microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions/