2018年2月27日火曜日

powershellの自分で作った関数の引数はカッコでくくるとダメ

自分で作った関数の引数はカッコでくくると、正常に動作しない。
.Net Frameworkの関数を使うときは引数をカッコでくくるが、自分で作った関数の引数はカッコでくくらない。
理由は、最後に記載するが、まずは例として次のような関数を作った場合の呼び出し方と実行結果と記載する。

function SampleFnc1([string]$param1 , [string]$param2)
{
    Write-Output "param1=$param1"
    Write-Output "param2=$param2"
}

# この場合、第一引数が文字列の配列となる。(エラーにはならない。)
SampleFnc1("abc","def")  
# param1=abc def
# param2=

# 正常な関数呼び出し
SampleFnc1 "abc" "def"
# param1=abc
# param2=def

# 正常な関数呼び出し。 powershellは引数が足りなくてもエラーにならない(第2引数はNULLになる。)
SampleFnc1 "abc"         
# param1=abc
# param2=

# 正常な関数呼び出し。powershellらしい呼び出し方
SampleFnc1 -param1 "abc"  -param2 "def"
# param1=abc
# param2=def

# 正常な関数呼び出し。  引数名を指定する場合は、第2引数のみ指定することも可能
SampleFnc1                -param2 "def" 
# param1=
# param2=def


-------
なぜpowershellで引数をカッコでくくると正常に処理されないかというと、powershellではかっこでくくると1つの配列となりまとめて処理されるため、上記の問題が発生する。

$a = ("abc","def")     # カッコでくくると配列になる。
$a.GetType().FullName  # 配列のためSystem.Object[]となる。  (System.Stringにはならない。)
$a[1]                  # def

0 件のコメント:

コメントを投稿