Есть ли способ получить имя функции PowerShell из функции? - PullRequest
18 голосов
/ 11 сентября 2010

Например:

function Foo { 
    [string]$functionName = commandRetrievesFoo
    Write-Host "This function is called $functionName"
}

Выход:

PS > Foo
This function is called foo

Ответы [ 4 ]

29 голосов
/ 11 сентября 2010

Вы можете использовать $MyInvocation, который содержит некоторую полезную информацию о том, что в данный момент выполняется.

function foo {
    'This function is called {0}.' -f $MyInvocation.MyCommand
}
5 голосов
/ 19 ноября 2015

Когда вы находитесь в функции, вы можете получить доступ к автоматической переменной $ PSCmdLet .

Это чрезвычайно полезная переменная, которая содержит много информации о выполняемом в данный момент командлете.

В нашем сценарии мы хотели имя и определение текущей функции для некоторой рекурсии. $ MyInvocation был нулевым, потому что функция была в модуле PowerShell.

Однако в объекте PSCmdLet есть свойство «MyInvocation», которое содержит всю необходимую информацию и позволяет запускать наш сценарий.

например. $ PSCmdlet.MyInvocation.MyCommand.Name = Имя функции $ PSCmdlet.MyInvocation.MyCommand.Definition = Определение функции

2 голосов
/ 04 октября 2011

Опция Get-PSCallStack, кажется, работает только один раз: при вызове функции из тела скрипта, первый раз она получит имя скрипта, а во второй раз - текст ''

0 голосов
/ 02 мая 2018

Легко.

function Get-FunctionName ([int]$StackNumber = 1) {
    return [string]$(Get-PSCallStack)[$StackNumber].FunctionName
}

По умолчанию Get-FunctionName в этом примере получит имя функции, которая его вызвала.

Function get-foo () {
    Get-FunctionName
}
get-foo
#Reutrns 'get-foo'

При увеличении параметра StackNumber будет получено имя следующего вызова функции.

Function get-foo () {
    Get-FunctionName -StackNumber 2
}
Function get-Bar  () {
    get-foo 
}
get-Bar 
#Reutrns 'get-Bar'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...