2013-05-12 6 views
6

Hier ist ein Powershell-Skript:Powershell ignoriert Ausdruck nach Funktionsaufruf

function PickANumber() 
{ 
    12 
} 

function GetTheAnswer() 
{ 
    PickANumber + 30 
} 

$answer = GetTheAnswer 
write-output "The answer is $answer" 

Die Ausgabe dieses Skripts ist:

The answer is 12 

Soweit ich Vermutung nennen, dies geschieht, weil Powershell Funktionsaufrufe Sie müssen keine Klammern um die Argumente oder Kommata zwischen ihnen haben, daher wird PickANumber + 30 als etwas wie PickANumber('+', 1) anstelle von PickANumber() + 1 geparst. Und das ist kein Fehler, die unbenutzten Argumente werden einfach ignoriert (wie bei JavaScript).

Wenn Sie etwas ändern, dann ist die Antwort 42:

function GetTheAnswer() 
{ 
    $a = PickANumber 
    $a + 30 
} 

Aber sicher gibt es eine Möglichkeit, dies auf einer Linie zu tun?

Ich poste hier, weil dies auch jemand anderen beißen wird.

Antwort

3

dieser Gefahr vermeiden Sie Ihre Funktionen wie diese

function PickANumber() 
{ 
    [CmdletBinding()] 
    param() 

    12 
} 

definieren könnte Wenn PickANumber + 30 Ausführung werden Sie den Fehler erhalten

PickANumber: Ein Positionsparameter nicht gefunden werden kann, dass Argument ‚akzeptiert + ".

+0

Großartig, dies führt dazu, dass der falsche Code einen Fehler gibt. Kombiniere nun mit der anderen Antwort "(PickANumber) + 30" um den Fehler zu beheben. – Anthony

8

Der korrekte Aufruf ist

(PickANumber) + 30 

Der ursprüngliche Code PickANumber + 30 bedeutet einen Aufruf an PickANumber mit zwei Argumente + und 30, die von PickANumber einfach ignoriert werden.

Verwandte Themen