メンバー名を変数で指定する

概要

 C#などのプログラミング言語ではあまりなじみのないやり方ですが、スクリプト言語であるPowerShellでは、何か特別な機能を利用しなくてもメンバーの名前を変数で指定することができます。

プロパティ名を変数で指定する

 とりあえず、Get-ChildItemコマンドレットの結果を変数$fileに入れてみましょう。

PS U:\Work> $file = (Get-ChildItem)[1]

 変数の中身を確認してみます。

PS U:\Work> $file


    ディレクトリ: U:\Work


Mode                LastWriteTime   Length Name
----                -------------   ------ ----
d----        2011/04/13     22:07          Archive

 変数 $member にプロパティの名前を代入します。

PS U:\Work> $member = "LastWriteTime"

 変数でプロパティの名前を指定します。

PS U:\Work> $file.$member

2011年4月13日 22:07:41


PS U:\Work>

 LastWriteTimeプロパティの値が取得できました。

メソッド名を変数で指定する

 プロパティを参照したときと同じ変数 $file を使用して、今度はメソッドを呼び出してみます。次のメソッドを呼び出す方法を考えます。

PS U:\Work> $file.GetHashCode()
29942614
PS U:\Work>

 メソッドの場合はプロパティほど分かりやすくはありませんが、とりあえず、プロパティと同じような方法を試してみましょう。

PS U:\Work> $methodName = "GetHashCode"
PS U:\Work> $file.$methodName

MemberType          : Method
OverloadDefinitions : {int GetHashCode()}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : int GetHashCode()
Name                : GetHashCode
IsInstance          : True

PS U:\Work>

 メソッドは実行されず、メソッドそのものがオブジェクトとして出力されてしまいました。

 しかし、これで失敗だと判断するのはまだ早いです。メソッドそのものもオブジェクトですから、メンバー一覧を調べることができます。

PS U:\Work> $file.$methodName | Get-Member

   TypeName: System.Management.Automation.PSMethod

Name   MemberType Definition
----   ---------- ----------
Invoke Method     System.Object Invoke(Params System.Object[] arguments)

PS U:\Work>

 説明の都合上、関係のないメンバーは省略しました。Invokeという意味ありげなメソッドがあったのでこれを実行してみます。

PS U:\Work> $file.$methodName.Invoke()
29942614
PS U:\Work>

 ちゃんと実行されました。$methodNameで指定するメソッドに引数が必要な場合、Invokeメソッドの引数として指定すれば良いです。

inserted by FC2 system