2009-04-07 8 views
1

Betrachten wir eine solche Funktion:

$missed = "{716C1AD7-0DA6-45e6-854E-4B466508EB96}" 

function Test($foo = $missed, $bar = $missed) 
{ 
    if(!$foo) 
    { 
    throw "error" 
    } 

    if(!$bar) 
    { 
    throw "error" 
    } 
} 

I whould diese Funktion auf diese Weise

Test -foo $foo -bar $bar 

Aber wenn $ foo oder $ bar ist $ null, wird Ausnahme ausgelöst nennen möchte. Die naive Lösung ist

if($foo -and $bar) 
{ 
    Test -foo $foo -bar $bar 
} 
elseif ($foo) 
{ 
    Test -foo $foo 
} 
elseif ($bar) 
{ 
    Test -bar $bar 
} 
else 
{ 
    Test 
} 

Wie kann ich diese if/else-Block in einer/zwei Zeilen umschreiben?

Antwort

3

Seit Sie haben keine Kontrolle über die Testfunktion, dann können Sie dies tun:

$params = @() 
if ($foo) { 
    $params += "-Foo","`$foo" 
} 
if ($bar) { 
    $params += "-Bar","`$bar" 
} 
Invoke-Expression "Test $params" 
1

Sie die Funktion als schreiben könnte -

if ($ foo!) {$ Foo = $ verpasst}
if ($ bar!) {$ Bar = $ verpasst}

+0

Eigentlich habe ich keinen Zugriff auf Testfunktion Implementierung und $ verpasste Variable. Es war nur eine Illustration. Ich weiß nur, dass diese Funktion einen Fehler auslöst, wenn einer der Parameter $ null ist – alex2k8

+0

Dann, wenn Sie wissen, wofür die Funktion den fehlenden Wert setzt ($ fehlt), können Sie sie vor dem Aufruf setzen, dh die 2 oben geschriebenen ifs gehen vor Funktionsaufruf –

2
function m ($x) {if ($x) {$x} else {$missed}} 

Test -foo (m $foo) -bar (m $bar) 
1

You "splatting" verwenden könnte wie folgt:

$params = @{} 
if ($foo) {$params['foo'] = $foo} 
if ($bar) {$params['bar'] = $bar} 
Test @params 

Es ist nicht viel kürzer, aber es ist ein allgemein nützlicher Trick.

Verwandte Themen