Как определить именованный параметр как [ref] в 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.

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


person David Klempfner    schedule 13.04.2015    source источник


Ответы (2)


Я заметил, что вы используете «рабочий процесс» в своем примере параметра [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] в рабочем процессе целесообразно из-за ограничений рабочего процесса.

person Jan Chrbolka    schedule 13.04.2015
comment
На самом деле это не отвечает на мой вопрос, поскольку работает только с функциями, а не с рабочими процессами. - person David Klempfner; 13.04.2015

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

person Jim Björklund    schedule 02.12.2016
comment
Почему у вас <br> в конце каждой строки? - person David Klempfner; 11.10.2019
comment
Без понятия, как они туда попали. Я удалил их. - person Jim Björklund; 13.10.2019