2017-05-17 2 views
2

Ich habe den folgenden Code:Erhalten Namen Aufruf Funktion in 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 

Das Ergebnis hiervon ist:

foo 
demo 

Was will ich stattdessen bekommen ist:

bar 
demo 

Das Problem scheint zu sein, dass ich innerhalb der Funktion foo die Funktionsleiste mit dem Invoke-Command-Cmdlet und dem powshel aufruft Ich sehe dies als die aufrufende Funktion von demo. Durch mein Verständnis ruft die Funktionsleiste Demo, nicht foo.

Ich kann nicht herausfinden, warum Powershell so verhält und wie zu dem Punkt, wo Powershell mir den Funktionsnamen "bar" zurückgibt. Sogar meine Idee Powershell mit den Worten zu „Narren“:

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

führte zu keinem Erfolg führen, in Bezug auf „bar“. Ich bin an dem Punkt, an dem ich verzweifelt um deine Hilfe rufe.

+2

Wenn Sie tatsächlich 'bar' in den Call-Stack wollen wollen, dann warum schiebst du die Definition in einen Skriptblock, anstatt sie nur anzurufen? z.B. 'Funktion foo {bar}' – BenH

+1

genau. Sie haben nie 'bar' aufgerufen. Sie haben einen ScriptBlock aufgerufen, der in '$ sb' gespeichert wurde (aus' bar') – Clijsters

+0

Das ist genau das Problem, das ich nicht sah! Vielen Dank Ihre Antworten - sehr geschätzt. – nococo

Antwort

0

In den Fragekommentaren klingt es, als ob das ursprüngliche Problem gelöst wurde, indem man den Ansatz vereinfachte. Aber ich denke, ich bin auf eine Antwort auf die Frage selbst gestoßen. Ich änderte .Command zu .FunctionName im Demo-Code:

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 

Und Ausgabe zeigt nun bar (statt foo) wie gewünscht:

demo 
bar