2017-05-17 3 views
2

je le code suivant:Obtenir le nom de la fonction invoquant dans Powershell

function foo() { 
    $sb = (Get-Command bar -CommandType Function).ScriptBlock 
    Invoke-Command -ScriptBlock $sb 
} 

function bar() { 
    demo 
} 

function demo() { 
    Write-Host $((Get-PSCallStack)[0].Command) 
    Write-Host $((Get-PSCallStack)[1].Command) 
} 

foo 

Le résultat de ceci est:

foo 
demo 

Ce que je veux à la place:

bar 
demo 

Le problème semble être que dans la fonction foo j'appelle la barre de fonction en utilisant la cmdlet Invoke-Command et ce powershel Je vois cela comme la fonction d'appel de la démo. D'après ce que je comprends, la barre de fonction appelle démo, pas foo.

Je n'arrive pas à comprendre pourquoi powershell se comporte ainsi et comment arriver au point où powershell me renvoie le nom de la fonction "bar". Même mon idée de « fou » powershell en disant:

function bar() { 
    $sb = (Get-Command demo -CommandType Function).ScriptBlock 
    Invoke-Command -ScriptBlock $sb 
} 

n'a pas donné lieu à aucune réussite en ce qui concerne « bar ». Je suis au point où je demande désespérément votre aide.

+2

Si vous voulez réellement veulent 'bar' dans la pile d'appel alors pourquoi est-ce que vous envoyez la définition dans un script plutôt que de simplement l'appeler? par exemple. 'Fonction foo {bar}' – BenH

+1

exact. Vous n'avez jamais appelé 'bar'. Vous avez appelé un ScriptBlock enregistré dans '$ sb' (tiré de' bar') – Clijsters

+0

C'est exactement le problème que je n'ai pas vu! Merci beaucoup vos réponses - très appréciées. – nococo

Répondre

0

Dans les commentaires de questions, il semble que le problème original a été résolu en simplifiant l'approche. Mais je pense que je suis tombé sur une réponse à la question, elle-même. J'ai changé .Command à .FunctionName dans le code de démonstration:

function foo() { 
    $sb = (Get-Command bar -CommandType Function).ScriptBlock 
    Invoke-Command -ScriptBlock $sb 
} 

function bar() { 
    demo 
} 

function demo() { 
    Write-Host $((Get-PSCallStack)[0].FunctionName) 
    Write-Host $((Get-PSCallStack)[1].FunctionName) 
} 

foo 

Et sortie montre maintenant bar (au lieu de foo) comme on le souhaite:

demo 
bar