天地有情

PowerShell の関数定義

PowerShell の関数定義

一連の処理(プログラム)に名前を付けて,コマンドレッド(cmdlet)のように
使えるようにするのが関数(Function)です.

あらかじめシステム側で定義済みの関数名の種類とユーザ側で関数を定義する方法について説明します.

■システム側で定義済みの関数名

一覧を表示させるには次のようにコマンドラインで入力します.

PS> Get-ChaildItem function:
あるいはエイリアス名を使って
PS> ls function: または dir function:

代表的な関数名を挙げておきます.
help
mkdir
more
prompt
cd..
cd\
A: ~ Z:


■ユーザ側で関数を定義する

先ずは関数の構文規則をまとめておきます.

==================================================
function 関数名 [(引数[=デフォルト値] , ...)]
{
関数本体
[return 戻り値]
}
実行は
関数名 引数1 引数2 ~ のように空白区切りとします.
==================================================

なお,引数が存在しない(あるいは引数名を明示的に宣言しない)場合には,関数名の後ろのカッコは省略できます.

簡単な例として三角形の面積を求める Triangle関数 で説明します.
※ 変数 $width=底辺,$height=高さ

(1)
   function Triangle($width=1,$height=1){
   return $width * $height / 2
   }
   実行: Triangle 5 7 → 17.5
   引数値が与えられなかった場合はデフォルト値が作用します.
   実行: Triangle  → 0.5

(2)
   引数を明示的に指定した呼び出しもできます.
   実行: Triangle -width 5 -height 7
   この形式では引数の指定に順番は関係ありません.

(3)
   パラメータ文 param を使うこともできます.
   function Triangle{
   param($width,$height)
   return $width * $height / 2
   }
   実行: Triangle 5 7 → 17.5

(4)
   先述は $width や $height のように引数に名前がありましたが,
   名前なし引数を使って定義します.
   
   function Triangle{
   return $args[0] * $args[1] / 2
   }
   実行: Triangle 5 7 → 17.5
   引数は自動変数 $args(配列)を介して取得することができます.
   
   ※ (1)~(4)のいずれか一つをシェルファイル(sample01.ps1)に記述した場合は
     PS> ./sample01.ps1
     ps> Triangle 5 7
   のようにして実行します.残念ながら次のようなエラーメッセージが表示されます.
   
   ----------------------------------------------------------------------------------
   用語 'Triangle'は、コマンドレット、関数、スクリプト ファイル、または操作可能な
   プログラムの名前として認識されません。....
   ----------------------------------------------------------------------------------
   
   この問題を解決するには[変数のスコープ](変数の有効範囲)を意識する必要があります.
   詳細は後述しますが, Global:Triangle のように[グローバル・スコープ]に設定します.
   (4)の例で示せば,
   
   function Global:Triangle{
   return $args[0] * $args[1] / 2
   }
   
   実行:
   PS> ./sample01.ps1
   PS Triangle 5 7  → 17.5
   
(5)変数のスコープ
   関数が登場すると,いよいよ意識しなければならなくなるのが変数のスコープです.
   スコープとは,プログラム中での変数の有効範囲のことです.
   つぎの3種のスコープがあります.
   
   ● すべてのスコープから参照できる[グローバル・スコープ](Global:)
   ● 関数内部でのみ有効な[ローカル・スコープ](Local:)
   ● スクリプトファイル内のすべてのスコープから参照可能な[スクリプト・スコープ
   
   (4)で述べたエラーは sample01.ps1 の中で定義された Triangle 関数は,スクリプト・スコープ
   に属するため,スクリプト外のスコープからは参照できないことから起こるのが原因でした.
   
(6)スコープ修飾子
   このスコープ修飾子は変数に対しても有効です.
   $Global:width (グローバル変数)
   $Local:width(ローカル変数)
   
(7)PowerShell ではプロファイルという機能を提供しており,起動時に決められたスクリプトを読み込み
   実行することができます.よく使う関数やエイリアスなどは,このプロファイル機能を利用して登録
   しておくと便利です.
   なお,profile.ps1 の内容はすべて[グローバル・スコープ]で登録されます.従って,
   スコープ修飾子によるスコープ宣言を行う必要はありません.

   
   
   
スポンサーサイト
  1. 2013/06/11(火) 13:31:15|
  2. PowerShell
  3. | トラックバック:0
  4. | コメント:0
<<PowerShell 制御文 | ホーム | PowerShell ツマミある記 TOP20>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://konoyonohana.blog.fc2.com/tb.php/30-3ed2c093
この記事にトラックバックする(FC2ブログユーザー)