メモ:PowerShellのAdd-MemberでCOMオブジェクトを拡張する
PowerShellではAdd-Member
コマンドレットを使って、任意のオブジェクトを拡張することが出来る。
この「任意のオブジェクト」にCOMオブジェクトも含まれていたため、動作確認も含めてメモ。
(Add-MemberそのものについてはAdd-Member を極める - 鷲ノ巣が詳しい)
やること
Scripting.Dictionary に TryGetValue
という名前のメソッドを追加する。
VBAで書くと以下のようなイメージ
Private dic As Scripting.Dictionary '... Function TryGetValue(Key As Variant, ByRef Value As Variant) As Boolean Dim isExist As Boolean isExist = dic.Exists(Key) If isExist Then Value = dic.Item(Key) 'TODO:Value / Object End If Let TryGetValue = isExist End Function
PowerShellのコード
# 拡張したCOMオブジェクトを取得する # Scripting.Dictionaryをインスタンスして次へ流す $dic = New-Object -ComObject Scripting.Dictionary | # TryGetValue という名前のメソッドを追加 Add-Member -Name TryGetValue -MemberType ScriptMethod -Value { # 引数の設定 param ([object]$Key, [ref]$Value) [bool]$exist? = $this.Exists($Key) if ($exist?) { $Value.Value = $this.Item($Key) } Write-Output $exist? } -PassThru # 拡張されたオブジェクトを出力 # 準備 $dic.Add('dog', '犬') $dic.Add('cat', '猫') # 通常の参照 Write-Host 通常: $dic.Item('dog') # => 通常: 犬 # TryGetValueの動作確認 foreach ($k in @('dog', 'cat','mouse')) { $val = '' if ($dic.TryGetValue($k, [ref]$val)) { Write-Host $k は存在する 値: $val } else { Write-Host $k は存在しない } } <# dog は存在する 値: 犬 cat は存在する 値: 猫 mouse は存在しない #>