VB.NETからPowerShellを利用する

VB.NETからPowerShellを利用するには?(peerさんからの質問です)

今回は、PowerShellのコマンドもしくはスクリプトを記述した文字列を、
VB.NETで実行・評価する方法を紹介します。

利用手順

System.Management.Automation.dllを参照に追加する

デフォルトでは「C:\Program Files\Windows PowerShell\v1.0」あります。

必要な名前空間をインポート
Imports System.Management.Automation
Imports System.Management.Automation.Runspaces
RunspaceInvokeオブジェクトを生成する
Dim runspaceInvoke As RunspaceInvoke = New RunspaceInvoke()
invokeメソッドで、スクリプト文字列を実行・評価する
Dim result As Object = _
 runspaceInvoke.Invoke("get-process | ?{$_.name -like ""win*""}")
結果を確認する

以下は実行結果となるPSObjectオブジェクトのメンバを確認しています。

For Each member As PSMemberInfo In result(0).Members()
    Debug.Print(member.Name & ":" & member.Value.ToString())
Next

出力結果は以下のようになります。

__NounName:Process
Name:winlogon
Handles:479
VM:64794624
WS:5132288
PM:8908800
NPM:54656
・
・
・

※途中、特定のプロパティ解析時、エラー(NullReferenceException)が出ます。
 printする前に、存在チェックが必要ですね。(^^;

上記サンプルのソース

Dim runspaceInvoke As RunspaceInvoke = New RunspaceInvoke()
Dim result As Object = _
    runspaceInvoke.Invoke("get-process | ?{$_.name -like ""win*""}")

For Each member As PSMemberInfo In result(0).Members()
    If IsNothing(member) = True Then Continue For
    Debug.Print(member.Name & ":" & member.Value.ToString())
Next

VSでWindowsアプリケーションを選び、フォームにボタンを配置。
ボタンのClickイベントに書いたコードです。

ソースの先頭でImportsを忘れずに・・・。

Imports System.Management.Automation
Imports System.Management.Automation.Runspaces