Назад | Перейти на главную страницу

Powershell, есть ли функция, возвращающая переменную, которая ее хранит?

Возможно ли, чтобы функция возвращала имя переменной, которая ее хранит?

т.е. $ a = myFunction

и знает ли функция, что она содержится в $ a, когда $ a динамически назначается ей в оболочке?

function test() {
    write-Host "Called by: $($MyInvocation.Line)"
}

$a = test

Какие выходы

Called by:     $a = test

?

Я не думаю, что это вообще возможно, и в этом нет особого смысла.

Это похоже на ожидание целого числа 42 чтобы узнать, сохранено ли оно в переменной $answer.


После возврата из функции в переменной сохраняется только ее возвращаемое значение (если есть) (если фактически используется присвоение). Если Get-Answer возвращается 42 и вы даете команду $answer = Get-Answer, затем $answer действительно будет содержать 42, но не будет сохраняться запись того факта, что он был сохранен там, после того как он был возвращен функцией; для всех намерений и целей конечные результаты $answer = 42 и $answer = Get-Answer идентичны, если Get-Answer действительно возвращается 42.

Кроме того, назначение (если есть) происходит только после функция возвращает; функция предоставляет только возвращаемое значение (если есть); ему все равно, и его не должно волновать, что PowerShell будет делать с этим значением после его возврата; и его возвращаемое значение вполне может быть отброшено вместо того, чтобы быть присвоенным чему-либо. Нет прямой связи между $answer и Get-Answer: что делает PowerShell, когда сталкивается с такой командой, как $answer = Get-Answer является:

  • Выполнить Get-Answer
  • Возьмите возвращаемое значение из Get-Answer
  • Сохраните это значение в $answer

Никто из игроков не знает об этой ссылке; функция не знает, для чего будет использоваться ее возвращаемое значение, а переменная не знает, откуда взялось присвоенное ей значение.

И даже если бы сохранилась какая-то запись о том, что это задание когда-либо происходило, этого бы точно не произошло, пока Get-Answer все еще выполнялся.

С минимальным количеством информации, которой вы поделились, это лучшее предположение, которое я мог сделать.
Я в основном использую ваше утверждение «передать какой-то другой вывод в другую функцию».

myFunction1 {
    ...code...
    return $someThing
}

myFunction2 {
    param ($param1)
    ...code...
}

использование

$a = myFunction1
myFunction2 $a

Имейте в виду, что командные команды echo или write-hosts внутри функции ТАКЖЕ возвращают значения. Используйте write-debug для отладочной информации, или, если вам действительно нужна эта информация, «возвращаемая» возвращается в виде массива (или настраиваемого объекта)

return @($var1, $va2, $var3)