以前作ったプログラムで、GUIが必要なので基本はVB6で作り、頻繁に変更が発生しそうな計算だけMSScriptControl.ScriptControlクラスを使った物を作りました。あらかじめAddCodeメソッドで外部のテキストファイルに書かれているVBScriptの関数を登録、計算時にRunメソッドで関数を呼ぶというものです。計算部分だけがテキストファイルで分離されているので、そこの差し替えだけでその場で対応が取れたりと柔軟に機能。自分としては結構うまくいった解決でした。
今回基本部分がVB.NETに変わったので、.NET Frameworkを利用できるPowerShellを利用しようかと、昨日から下調べを始めました。
VB.NETからはSystem.Management.Automation空間のクラスを使うらしい。事前にPowerShellをインストールし、Vista対応のWindows SDKをインストールするか、C#と諸々 を参考にSystem.Management.Automation.dllを入手して、プロジェクトに参照登録する必要があります。
以下、こうすれば動くのではないかという想像。まだ試してません。
- RunspaceConfigurationインスタンスに関数を登録
- そのインスタンスを引数にRunspaceFactory.CreateRunspaceでRunspaceインスタンスを生成
- Runspace.Open
- Runspace.CreatePipelineで関数を呼ぶ
- Runspace.ClosePipeline
さてPowerShellの使い方を覚えようと、XMLファイルを読むのを試しに作ってみる。以下のVB.NETのコードは動くことを確認。
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim xmldoc As New System.Xml.XmlDocument
xmldoc.Load("sample.xml")
Dim rootelement As System.Xml.XmlElement = xmldoc.DocumentElement
TextBox1.Text = rootelement.Name
End Sub
End Class
んで、これと同じことをPowerShellでやろうとコマンドを打ち込む。
PS C:¥XML> $xmldoc = new-object System.Xml.XmlDocument
PS C:¥XML> $xmldoc.Load("sample.xml")
PS C:¥XML> $rootelement = $xmldoc.DocumentElement
PS C:¥XML> $rootelement.Name
PS C:¥XML> $rootelement.GetType()
null 値の式ではメソッドを呼び出せません。
発生場所 行:1 文字:21
+ $rootelement.GetName( <<<< )
あら? $rootelement.Nameは何も表示しないし、GetType()を呼ぶと$rootelementはnullだという。う〜ん使い方が悪いのかXMLが読めていないのか、よくわからない。
以前JMP Version4 をCOM Automationで使おうとしたとき、あるメソッドがVB6からは難なくアクセスできるのに、VBScriptからだとエラーになるという問題がありました(今は修正されていますし、該当バージョンでも回避法があります)。これはVB6とVBScriptが似ていても中身は別物ということに起因するらしいのですが、なんとなくそのことが頭を離れない。PowerShellもそんなことやってたりするの?
[参考]
[2007/9/6 追記] どうもPowerShellからアクセスできるメソッドに制限があるらしい・・・
Comments