2010-09-11 8 views

Respuesta

25

Usted puede utilizar $MyInvocation que contiene información útil acerca de lo que se ejecuta actualmente.

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

que funciona - gracias alguna idea de cómo obtener el nombre de función de llamada? Intenté otras propiedades $ myInvocation pero no veo ninguna. function foo {'Esta función se llama {0}.' -f $ MyInvocation.MyCommand 'Esta persona que llama se llama {0}.' -f $ MyInvocation.? } function CallFoo {foo} CallFoo – alphadev

+8

Si usa PowerShell 2.0, use '(Get-PSCallStack) [1] .Command'. –

+2

Haz esa pregunta por separado, para que la gente pueda encontrarla. La respuesta en v1 está en 'gv -sc $ _ myinvocation'. Ver http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!172.entry –

2

La opción Get-PSCallStack parece funcionar sólo una vez: cuando se llama a una función desde el cuerpo de la escritura, la primera vez que va a recuperar el nombre del script, pero la segunda vez que va a recuperar el texto ''

+0

Parece ser repetible para mí, devolviendo la pila de llamadas cada vez que lo llamo. Quería encontrar el nombre de la función de llamada y usar Get-PSCallStack parece ser la manera de hacerlo; el método en el enlace de Jay Bazuzi no me dio el nombre de la función de llamada. Para cualquier otra persona, utilicé 'Get-PSCallStack | Select-Object FunctionName -Skip 1 -First 1' para obtener el nombre de la función de llamada. Si se llama a la función actual desde el script de nivel superior, se devolverá ''. –

4

Cuando se encuentra en una función, puede acceder a la variable automática $ PSCmdLet.

Esta es una variable extremadamente útil que contiene mucha información sobre el cmdlet actualmente en ejecución.

En nuestro escenario, queríamos el nombre y la definición de la función actual para algunas recursiones. $ MyInvocation era nulo porque la función estaba dentro de un módulo de PowerShell.

Sin embargo, hay una propiedad "MyInvocation" en el objeto PSCmdLet que contiene toda la información necesaria y permite que se ejecute nuestro escenario.

p. Ej. $ PSCmdlet.MyInvocation.MyCommand.Name = El nombre de la función $ PSCmdlet.MyInvocation.MyCommand.Definition = La definición de la función

+1

'$ PSCmdlet' parece que solo funciona si la función tiene un atributo' [CmdletBinding()] 'explícito. – jpmc26

+0

El [about_automatic_variables] (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1) la entrada de $ PsCmdlet dice 'Contiene un objeto que representa el cmdlet o la función avanzada que se está ejecutando'. Por lo tanto, solo funciona con funciones avanzadas, que tienen CmdletBindingAttribute, no funciones normales. –

Cuestiones relacionadas