2010-09-11 4 views

ответ

25

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

function foo { 
    'This function is called {0}.' -f $MyInvocation.MyCommand 
} 
+0

Это работает - спасибо любой идеи, как получить имя функции вызова? Я пробовал другие $ myInvocation свойства, но я их не вижу. function foo {'Эта функция называется {0}.' -f $ MyInvocation.MyCommand 'Этот вызывающий вызов называется {0}.' -f $ MyInvocation.? } function CallFoo {foo} CallFoo – alphadev

+8

Если вы используете PowerShell 2.0, используйте '(Get-PSCallStack) [1] .Command'. –

+2

Сделайте это отдельным вопросом, чтобы люди могли его найти. Ответ в v1 находится в 'gv -sc $ _ myinvocation'. См. Http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!172.entry –

2

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

+0

Кажется, меня повторяют, возвращая стек вызовов каждый раз, когда я его вызываю. Я хотел найти имя вызывающей функции и использовать Get-PSCallStack, похоже, это способ сделать это; метод в ссылке Джей Базузи не дал мне имя вызывающей функции. Для кого-то еще я использовал «Get-PSCallStack | Select-Object FunctionName -Skip 1 -First 1', чтобы получить имя вызывающей функции. Если текущая функция вызывается из сценария верхнего уровня, это вернет ''. –

4

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

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

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

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

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

+1

'$ PSCmdlet' появляется, только если функция имеет явный атрибут' [CmdletBinding()] '. – jpmc26

+0

[about_automatic_variables] (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1) запись для $ PsCmdlet говорит: 'Содержит объект, который представляет командлет или расширенную функцию, которая запускается'. Таким образом, он работает только с расширенными функциями, которые имеют CmdletBindingAttribute, а не обычные функции. –

Смежные вопросы