PowerShellを使っていてハマった仕様についてのメモです。
関数は最初に書かなければならない
このコードは正しくありません。
1 2 3 4 5 |
f function f() { Write-Host "hoge" } |
以下のエラーが発生します。
f : 用語 'f' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
正しくはこう書きます。関数定義の後ろで呼び出すだけです。
1 2 3 4 5 |
function f() { Write-Host "hoge" } f |
ちゃんとメッセージが出力されます。
1 2 |
PS C:\> C:\test.ps1 hoge |
でももしPowerShell ISEで編集している場合、この後に元のコードに戻すと動きます。関数が定義されたことを覚えているみたいです。便利な場合もあるかもしれませんが、ISEでテストして実際に動かそうとなった時にエラーになる罠。
関数の呼び出しにカッコは不要
このコード、普通は"x"が表示されると思いますよね?
1 2 3 4 5 |
function f($a, $b) { Write-Host $a } f("x", "y") |
でも実行結果はこうなります。$aに両方の引数が格納されてしまいます。PowerShellでこの書き方だと配列を表すらしいです。
1 2 |
PS C:\> C:\test.ps1 x y |
正しくはこう書きます。呼び出し側でカッコやカンマ区切りは不要です。
1 2 3 4 5 |
function f($a, $b) { Write-Host $a } f "x" "y" |
ちゃんと"x"のみが出力されます。
1 2 |
PS C:\> C:\test.ps1 x |
引数が1個だけの時は問題無いけど2個以上だとおかしくなる罠。
デストラクタが無い
そのまんま。コンストラクタはあるけどデストラクタはない。いやいやあるだろうと散々探したけど無かった。