[PS1] Powershell の基本 (4:関数)

2014年12月5日
  1. 呼び出し

     一般の関数と同じように思ってしまうが、いろいろと異なります。
     宣言(定義)は以下のような感じで一般言語とあまり変わりません。

    PS> function A_add_B_plus1($a, $b) {
     >>   return $a + $b + 1
     >> }
     >>
    

     ただし、呼び出す際に括弧とカンマとかは必要ありません。

    PS>A_add_B_plus1 10 20
    31
    

     不用意に括弧とかカンマとかつけると、謎の結果が戻ってきます。(*1)

    PS> A_add_B_plus1(10,20)
    10
    20
    1
    PS>
    

     他方、パラメーターを指定して呼び出すことが可能です。

    PS> function sub($paraA, $paraB) {
     >>   $paraA - $paraB
     >> }
     >>
    PS> sub -paraA 20 -paraB 10
    10
    PS> sub -paraB 20 -paraA 10
    -10
    

  2. 戻り値

     戻り値を戻すのに return は不要です。

    PS> function add($a, $b) {
     >>   $a + $b
     >> }
     >>
    PS> add 10 20
    30
    PS>
    

     パイプラインに複数の値を渡すと、複数の戻り値が戻ります。

    PS> function add1($a, $b) {
     >>   $a + 1
     >>   $b + 1
     >> }
     >>
    PS> $a = add1 10 20
    PS> $a.Count
    2
    PS> $a
    11
    21
    PS>
    

  3. パイプラインから入力

     パイプラインからの入力も $_ で拾えます。また、パイプラインの入力に先立って初期化処理を行いたい場合は、に初期化部分を begin ブロックに、パイプラインのイテレーター部分を process ブロックに記述することで実現できます。

    function func1($a, $b) {
      begin {
        $lineNo = 1
      }
    
      process {
        $judge = $lineNo % 2
    
        if ($judge -eq 1) {
          $_ * $a        # 奇数行は $a 倍
    
        } else {
          $_ * $b        # 偶数行は $b 倍 
    
        }
    
        $lineNo += 1     # 行番号を加算
      }
    }
    
    PS> @(1,2,3,4,5) | func1 10 100
    10
    200
    30
    400
    50
    

  4. 等価コード

     以下の 2つは等価です。process ブロックを使用しない場合、$input がパイプラインの内容なので、それを扱うことで同じことができます。

    function func1($a) {
      begin {
        "begin"
      }
      process {
        $_ + $a
      }
      end {
        "end"
      }
    }
    
    function func2($a) {
      "begin"
    
      $input | % { $_ + $a }
    
      "end"
    }
    
    PS> @(1,2,3) | func1 100
    begin
    101
    102
    103
    end
    
    PS> @(1,2,3) | func2 100
    begin
    101
    102
    103
    end
    

  5. 無名関数

     プレイスで囲ったものが、無名関数になります。実行する場合は、先頭に & を付加します。

    PS> $a = { $b + $_ }
    PS> @(1,2,3) | % { &$a 10 }
    11
    12
    13
    
    PS> $a = { process { $b + $_ } }
    PS> @(1,2,3) | &$a 10
    11
    12
    13
    

  • (*1)

     10,20 という指定は「$a に 10, $b に 20」ではなく、「$a に配列 @(10,20)」 が渡ることによって起こる。
     つまり、「@(10,20) + $null + 1」という式になり、結果「@(10,20,$null,1)」が生成される。($null は見た目表示されないが、要素しては格納されている)






タグ:
カテゴリー: PowerShell, Windows

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org