tech.guitarrapc.cóm

Technical updates

PowerShell 4.0でプロパティ以外にメソッドもDynamic Invokeできるようになりました

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-ChildItemFullnameプロパティにアクセスする場合は、以下のようにします。

$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

これは結構大きなインパクトがあります。 相当便利ですね!

参考