LoginSignup
0
0

More than 5 years have passed since last update.

PowerShellで関数名とエイリアス名が衝突して無限ループに陥った件

Last updated at Posted at 2015-10-28

あるいは関数命名ルールについて。。。

当たり前といえば当たり前なんですが、もうタイトルの通りです。

うっかりエイリアスを設定した

PowerShellではUnixっぽさやコマンドプロンプトとの互換性を確保するためにエイリアスが多用されています。加えてUnix同様、カレントディレクトリ中の実行ファイルであっても正しくパスを与えないと動作しない仕様。

なので、PowerShellスクリプトを書いたらエイリアスを設定してやると便利ですよねー。

  1. Script.ps1内にhogehoge()という関数をかいた

  2. Script.ps1内でhogehogeを呼び出すスクリプトだ

  3. ./Script.ps1って入力するのめんどくさい

  4. Set-Alias hogehoge C:\User\home\Script.ps1

  5. >> hogehoge

…止まりません。(泣

だって関数名には機能を表す名前つけるじゃないですかー。エイリアスだって機能を表すコマンド名にしたいじゃないですかー。

関数の呼び出しにカッコ付けないというPowerShellの仕様は如何なものか。o(`ω´ )o

エイリアスについて

TechNetによりますと。
Windows PowerShell エイリアス

Windows PowerShell におけるエイリアスとは、コマンドレット、関数、スクリプト、実行可能ファイルなどに割り当てられた別名のことです。PowerShell コマンド プロンプトから実行できるほとんどすべての処理には、エイリアスを割り当てられます。

エイリアスは関数に対しても割り当てることができるから、名前がかぶっちゃったらエイリアスが最優先されるんだね。

だからさっきプロンプトでhogehogeって入力したら一旦Script.ps1が呼び出されたんだけど、内部で関数をコールしたつもりのhogehogeはエイリアスを呼んで…

_人人人人人人人人人_
> 無限ループ!! <
 ̄YYYYYYYYY ̄

関数について

TechNetによりますと。
Windows PowerShell: より良い関数を作成する

関数名はコマンドレット名と同じ形式にする必要があります。つまり、Get のような Windows PowerShell でよく使用される動詞で始まり、単数名詞で終わる必要があります。

まじかー!

とりあえずこのルールに則らなくても関数は機能するけれど、直接コマンド的に呼び出す関数名はともかく、スクリプト内で使用する関数名はこれに従ったほうがよさそう。

別解、スクリプトブロック

TechNetによりますと。
about_Script_Blocks

Syntactically, a script block is a statement list in braces, as shown in
the following syntax:

   {<statement list>}

関数のFunction hogehoge()部分を取っただけみたいな。。。

これを変数に代入できるので、呼び出し時は\$で始まる$hogehogeになるのでエイリアスと干渉しない。これでもいいか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0