メモ: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 は存在しない
#>