メンバー名を変数で指定する
概要
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メソッドの引数として指定すれば良いです。