2009-04-07 9 views
1

Tenir compte cette fonction:

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

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

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

Je whould aime appeler cette fonction ainsi

Test -foo $foo -bar $bar 

Mais si foo $ ou $ bar est $ null, exception sera levée. La solution naïve est

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

Comment puis-je réécrire ce bloc if/else en une/deux lignes?

Répondre

3

Depuis vous avez aucun contrôle sur la fonction de test, vous pouvez le faire:

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

Vous pouvez écrire la fonction -

if ($ foo!) {$ Foo = $ manqués}
si (barre de $!) {$ Bar = $ manqué}

+0

En fait, je n'ai pas accès à l'implémentation de la fonction Test et à la variable $ missing. C'était juste une illustration. Je sais juste que cette fonction déclenche une erreur quand l'un des paramètres est $ null – alex2k8

+0

Ensuite, si vous savez ce que la fonction définit comme valeur manquante ($ missing), pouvez-vous les définir avant de l'appeler, signifiant que les 2 ifs ci-dessus vont avant appel de fonction. –

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

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

vous pouvez utiliser « splatting » comme suit:

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

Ce n'est pas beaucoup plus court, mais c'est un truc généralement utile.