tech.guitarrapc.cóm

Technical updates

PowerShell Version 4では property 以外に methodも dynamic Invokeできるようになりました

PowerShell 4いよいよ全貌が見えて楽しい日々です。 さて、PowerShell 3.0では、Propertyに対するDynamicなアクセスは可能ですが、Method に対するアクセスではエラーが出てしまいます。 PowerShell 4.0では、Propertyだけでなく、Methodも DynamicにアクセスしてInvoke可能になりました。 では早速のその一例を。

PropertyへのDynamicなアクセス

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
では、変数にプロパティ名を入れてアクセスしてみましょう。
$path = Get-ChildItem -Path c:\

# Nameプロパティにアクセス
$property = "name"
$path.$property

# fullnameプロパティにアクセス
$property = "fullname"
$path.$property
すると、それぞれの変数に入れたプロパティ名でアクセスできることがわかります。
# ここはname プロパティ結果
downloads
inetpub
PerfLogs
Program Files
Program Files (x86)
sources
Users
Windows
RAMDisk.img
RAMDisk.img.bak

# ここから 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

MethodへのDynamicなアクセス

では、Methodも同様にアクセスできないでしょうか?

PowerShell 3.0でのMethodへのDynamicなアクセスはできない

PowerShell 3.0では、できませんでした。 例えば、GetType() メソッドにアクセスします。
$path = Get-ChildItem -Path c:\
$path.GetType()
当然取得できます。
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
しかし、Property同様にメソッド名を変数に入れてアクセスしようとすると...。
$method = "GetType"
$path.$method()
エラーになります。
An error occurred creating the pipeline
	+ CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
	+ FullyQualifiedErrorId : RuntimeException

PowerShell 4.0でMethodへのDynamicなアクセスはできるようになった

PowerShell 4.0はこれができます。 嬉しいですね!!
$method = "GetType"
$path.$method()
できました。
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
これは結構大きなインパクトがあります。 相当便利ですね!

サンプルコード

例によって GitHubにサンプルを https://github.com/guitarrapc/PowerShellUtil/tree/master/DynamicAccess

参考

http://technet.microsoft.com/en-us/library/hh857339.aspx http://www.powershellmagazine.com/2013/07/03/pstip-invoking-methods-by-using-dynamic-method-names/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+PowershellMagazine+%28PowerShell+Magazine%29