Windows PowerShell その3 : Function を使うの続き。
1) Function の呼び出し方法が違ってた…(汗。
(a,b,c) のような書き方は配列として扱われるようだ。
とりあえず、次のような簡単なスクリプトを用意。
========================
Function func($x,$y) {
echo call func
echo ====== x =======
$x
echo ====== y =======
$y
echo ================
}
func
func 1 2
func(1,2)
func("a","b","c")
========================
実行結果がこれ。
$x, $y に対して値の入力ができているのは2つ目の func 1 2 のみ。
========================
PS C:UsersyasuhiroDocuments> .test.ps1
call
func
======
x
=======
======
y
=======
================
call
func
======
x
=======
1
======
y
=======
2
================
call
func
======
x
=======
1
2
======
y
=======
================
call
func
======
x
=======
a
b
c
======
y
=======
================
========================
[int] などを使って、キャストも可能らしい。
Function func([int] $x,[int] $y) { } という感じ。
この場合、func(1,2) なんて呼び出しは NG 。エラーが出ます。
$x に配列を入れようとしてエラーを起こすというのが真実。
これを見るまで気が付きませんでした…(汗。
========================
func : パラメーター 'x' の引数変換を処理できません。"System.Object[]" の値を "System.Object[]" 型から "System.Int32" 型
に変換できません。
発生場所 C:UsersyasuhiroDocumentstest.ps1:14 文字:5
+ func <<<< (1,2)
+ CategoryInfo : InvalidData: (:) [func]、ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,func
========================
2) Function の返り値
今度は適当な関数を作る。
とりあえず、引数として数値を2つ受け取り、
適当な計算を行う。
Function の返り値の定義方法として return が用意されているが、
return だけが返り値となるわけではないらしい。
実行結果を見るとはっきりする。
===============================
Function func([int]$x,[int]$y) {
$x + $y
$x - $y
$a = $x * $y
pwd
return 5
}
$a = func 1 2
$a
===============================
Function の返り値は Function 内の出力結果全てとなるらしい。
上記の実行結果が下記の通り。
普通の感覚なら、$a = func 1 2 での呼び出しの返り値は return 5 なので、
最終行の $a で 5 だけ出力されそうなイメージするのだが、
func 内に $x + $y, $x - $y, pwd が実行されており、最後に return 5。
そのため、出力結果は $x + $y, $x - $y の計算結果 3, -1 が出力後、
pwd の出力結果、最後に 5 という結果になっている。
$a = $x + $y は結果を $a に代入しているので出力されない。
また、Function func と 外側の両方に $a が定義されているが、
独立していることが分かる。
まぁ、関数で外と同じというグローバル変数扱いされても困るんだが。
===============================
PS C:Users> .test.ps1
3
-1
Path
----
C:Users
5
===============================
っと、癖が強いなぁ…。
※コメント投稿者のブログIDはブログ作成者のみに通知されます