2010-09-11 4 views

Répondre

25

Vous pouvez utiliser $MyInvocation qui contient des informations utiles sur ce qui est en cours d'exécution.

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

Cela fonctionne - grâce une idée comment obtenir le nom de la fonction d'appel? J'ai essayé d'autres propriétés $ myInvocation mais je n'en vois pas. function foo {'Cette fonction s'appelle {0}.' -f $ MyInvocation.MyCommand 'Cet appelant s'appelle {0}.' -f $ MyInvocation.? } function CallFoo {foo} CallFoo – alphadev

+8

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

+2

Faites une question distincte pour que les gens puissent la trouver. La réponse dans v1 est dans 'gv -sc $ _ myinvocation'. Voir http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!172.entry –

2

L'option Get-PSCallStack semble fonctionner qu'une seule fois: lors de l'appel d'une fonction du corps du script, la première fois qu'il récupérera le nom du script, mais la deuxième fois, il récupérera le texte « »

+0

Semble être répétable pour moi, en retournant la pile d'appels chaque fois que je l'appelle. Je voulais trouver le nom de la fonction d'appel et l'utilisation de Get-PSCallStack semble être le moyen de le faire; la méthode dans le lien de Jay Bazuzi ne m'a pas donné le nom de la fonction d'appel. Pour quelqu'un d'autre, j'ai utilisé 'Get-PSCallStack | Select-Object FunctionName -Skip 1 -First 1' pour obtenir le nom de la fonction appelante. Si la fonction en cours est appelée à partir du script de niveau supérieur, cela renverra ''. –

4

Lorsque vous êtes dans une fonction, vous pouvez accéder à la variable automatique $ PSCmdLet.

Cette variable extrêmement utile contient de nombreuses informations sur la cmdlet en cours d'exécution.

Dans notre scénario, nous voulions le nom et la définition de la fonction actuelle pour une certaine récursivité. $ MyInvocation était null car la fonction était dans un module PowerShell. Toutefois, il existe une propriété "MyInvocation" sur l'objet PSCmdLet qui contient toutes les informations nécessaires et permet à notre scénario de s'exécuter.

par exemple. $ PSCmdlet.MyInvocation.MyCommand.Name = Le nom de la fonction $ PSCmdlet.MyInvocation.MyCommand.Definition = La définition de la fonction

+1

'$ PSCmdlet' semble fonctionner uniquement si la fonction possède un attribut [CmdletBinding()]' explicite. – jpmc26

+0

La variable [about_automatic_variables] (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1) L'entrée pour $ PsCmdlet indique 'Contient un objet qui représente la cmdlet ou la fonction avancée en cours d'exécution'. Donc, cela ne fonctionne qu'avec les fonctions avancées, qui ont le CmdletBindingAttribute, et non des fonctions normales. –

Questions connexes