PowerShell 4いよいよ全貌が見えて楽しい日々です。
PowerShell 3.0では、Propertyに対するDynamicなアクセスは可能ですが、Methodに対するアクセスではエラーが出てしまいます。PowerShell 4.0で、PropertyだけでなくMethodもDynamicにアクセスしてInvoke可能になりました。
その一例を紹介します。
PropertyへのDynamicなアクセス
サンプルコードです。
guitarrapc/PowerShellUtil - DynamicAccess | GitHub
PowerShell 3.0で.プロパティを使うとforeachせずともアクセスできるようになったのはご存じのとおりです。
例えば、Get-ChildItemでFullnameプロパティにアクセスする場合は、以下のようにします。
$path = Get-ChildItem -Path c:\ $path.fullName
結果このようにまとめてアクセスできます。
C:\downloads C:\inetpub C:\PerfLogs C:\Program Files C:\Program Files (x86) C:\sources C:\Users C:\Windows C:\RAMDisk.img C:\RAMDisk.img.bak
変数にプロパティ名を入れてアクセスしてみましょう。
PS> $path = Get-ChildItem -Path c:\ # Nameプロパティにアクセス PS> $property = "name" PS> $path.$property downloads inetpub PerfLogs Program Files Program Files (x86) sources Users Windows RAMDisk.img RAMDisk.img.bak # fullnameプロパティにアクセス PS> $property = "fullname" PS> $path.$property C:\downloads C:\inetpub C:\PerfLogs C:\Program Files C:\Program Files (x86) C:\sources C:\Users C:\Windows C:\RAMDisk.img C:\RAMDisk.img.bak
MethodへのDynamicなアクセス
では、Methodも同様にアクセスできないでしょうか?
PowerShell 3.0では、できませんでした。以下の例は、GetType()メソッドへのアクセスをプロパティ同様にメソッド名を変数に入れてますが、アクセスできません。
PS> $path = Get-ChildItem -Path c:\ PS> $path.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS> $method = "GetType" PS> $path.$method() An error occurred creating the pipeline + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : RuntimeException
PowerShell 4.0はこれができます。
PS> $method = "GetType" PS> $path.$method() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array
これは結構大きなインパクトがあります。 相当便利ですね!