Как определить именованный параметр как [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].
Для простоты, давайте назовем это "функцией" и вернемся к "рабочему процессу" позже.
В коде нужно изменить три вещи:
- При передаче параметра [ref] в функцию необходимо заключить параметр в круглые скобки
()
.
- При использовании параметра [ref] внутри функции обращайтесь к $ variable.value
- Удалите тип [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/