2009-04-07 9 views
1

は、このような機能を考えてみましょう:

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

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

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

私はこの方法

Test -foo $foo -bar $bar 

この関数を呼び出すために好きwhouldしかし、$ fooのか$バーが$ nullの場合、例外がスローされます。素朴な解決策は

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

です。このif/elseブロックを1/2行で書き直すにはどうすればよいですか?あなたのように関数を書くことができ

答えて

3

を{$バー= $を逃しました}あなたはテスト機能を制御できません、あなたはこれを行うことができます:

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

- (!$ fooの)場合

($バー!)場合
を{$ FOO = $逃し}ので

+0

実際に私はTest関数の実装と$ missing変数へのアクセス権がありません。それは単なるイラストであった。私は、この関数がいずれかのパラメータが$ nullのときにエラーをスローすることを知っています – alex2k8

+0

次に、関数が欠損値を($ missing)に設定しているかどうかを知っていれば、関数呼び出し。 –

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

Test -foo (m $foo) -bar (m $bar) 
1
次のように、「スプラッティング」を使用することができ

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

これはそれほど短くはありませんが、一般的に有用なトリックです。

関連する問題