2011-09-14 14 views
7

私はPowerShellで基本的に最初のパラメーターを評価し、それに基づいてコンピューター上のプログラムを実行するラッパー関数を記述しようとしています。ラッパー関数の残りのパラメーターはすべて、実行されたプログラムに渡されます。PowerShellのラッパー関数:残りのパラメーターを渡す

だから、それは次のようになります。

function test ([string] $option) 
{ 
    if ($option -eq 'A') 
    { 
     Write-Host $args 
    } 
    elseif ($option -eq 'B') 
    { 
     . 'C:\Program Files\some\program.exe' $args 
    } 
} 

今だけは動作しません$argsを追加するので、私はそれを動作させるためにしなければならないのですか?別のオプションはおそらくInvoke-Expressionを使用していますが、それはevalのように感じるので、私は可能な限り避けたいと思います。さらに、そうすることで、文字列のみのパラメータに制限されると思います。可能であれば、ラップされたプログラム/コマンドレット(基本的には動的エイリアスのようなもの)を完全にサポートしたいと考えています。それも可能ですか?

答えて

10

このようなことは、あなたが求めるものです。ダッシュプレフィックス付きのオプションを実行可能ファイルに渡す必要がある場合は、PowerShellの共通パラメータと競合したり、あいまいさを引き起こす可能性があります。しかし、これはあなたを始めさせるかもしれません。あなたが書いた何

function Invoke-MyProgram 
{ 
    [CmdletBinding()] 
    Param 
    (
     [parameter(mandatory=$true, position=0)][string]$Option, 
     [parameter(mandatory=$false, position=1, ValueFromRemainingArguments=$true)]$Remaining 
    ) 

    if ($Option -eq 'A') 
    { 
     Write-Host $Remaining 
    } 
    elseif ($Option -eq 'B') 
    { 
     & 'C:\Program Files\some\program.exe' @Remaining # NOTE: @ not $ (splatting) 
    } 
} 
2

else ifで構文エラーを除く - それはelseifする必要がありますが)作業を行います。 $argsがあるのは、関数が期待するパラメータの上にある名前のない引数です。

あなたは

test -option "A" 1 2 3 

$argsとしてテストを呼び出すのであれば、あなたが

test -option "A" -other "B" 1 2 3 

$argsとしてテストを呼び出す場合-other,B,1,2,3

を持っていることを 1,2,3

注意を持っています

関連する問題