PowerShellの関数の扱いが面倒

  • 関数呼び出しで括弧とコンマを使うと自分の感覚と違う動作をする
    • 括弧とコンマ(というかコンマ)は配列の初期化を意味するのでfoo(1,2)は1と2を要素に持つ配列をfooという関数に渡していることになる
    • ただオブジェクトのメソッドは括弧とコンマで呼び出さなければならない
  • 関数内で値を返す式を複数使うと関数の返り値がそれらを全部含めた配列になる
    • 値を1つだけ返したければ返したい値以外の式の頭に[void]をつけるなりダミー変数で受けるなりして値を返さないようにしなければならない
  • IEnumerableを実装するオブジェクト(ArrayListやらXmlNamespaceManagerやら)を1つ返そうとすると返り値がそのオブジェクトを配列に変換したものになる
    • そのままのオブジェクトを返したければ関数内で,$resultのようにコンマを入れるなどして要素1の配列を返すようにしなければならない

IEnumerableを実装するオブジェクトが配列に変換される例

function Get-XmlNSManager([xml] $xml) {
  $manager = New-Object Xml.XmlNamespaceManager $xml.PSBase.NameTable
  $manager #,$managerなどとするとXmlNamespaceManagerが返る
}
write (Get-XmlNSManager "<x/>").GetType().FullName

結果

System.Object[]