PerlのプログラムにVBScriptを埋め込んで関数として使う
Windowsでログの解析やシステム管理をしていると、WMIとか使いたくなる。
WMIの使用例はVBScriptになっている。もちろん、Win32::OLEを使って書き直せば Perlでも同じことができる。
しかし、手っ取り早く仕事を片付けたいときは、そのまま使えたほうがいい。
かといってVBScriptで正規表現とか簡単なレポート生成はPerlに比べて手間がかかる。
それなら、Perlの中にVBScriptを埋め込んで呼び出せばいい。
そんなモジュールがInline::WSCである。このモジュールはActivePerlならPPMでStrawberry PerlならCPANでインストールできる。
たとえば、WMIによるイベントログの取得はVBScriptで書き、レポート処理をPerlで書きたいときは、こんな風に書ける。
これでVBScriptの豊富な例題プログラムを利用して取得したデータをPerlの正規表現やレポート機能を使って加工できる。うまく使えばお得だけど、両方知らないとメンテできない。
WMIの使用例はVBScriptになっている。もちろん、Win32::OLEを使って書き直せば Perlでも同じことができる。
しかし、手っ取り早く仕事を片付けたいときは、そのまま使えたほうがいい。
かといってVBScriptで正規表現とか簡単なレポート生成はPerlに比べて手間がかかる。
それなら、Perlの中にVBScriptを埋め込んで呼び出せばいい。
そんなモジュールがInline::WSCである。このモジュールはActivePerlならPPMでStrawberry PerlならCPANでインストールできる。
たとえば、WMIによるイベントログの取得はVBScriptで書き、レポート処理をPerlで書きたいときは、こんな風に書ける。
use strict;
use warnings;
use Inline::WSC VBScript =><<'MyVBScript';
Const wbemFlagReturnImmediately = 16
Const wbemFlagForwardOnly = 32
Function getEvents(sql)
Dim strComputer,objWMIService,colEvents,IFlags
strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}\\" & strComputer & "\root\cimv2")
IFlags = wbemFlagReturnImmediately + wbemFlagForwardOnly
Set getEvents = objWMIService.ExecQuery(sql,,IFlags)
End Function
MyVBScript
# my @items = qw/Category ComputerName EventCode Message RecordNumber SourceName TimeWritten Type User/;
my @items = qw/EventCode Message TimeWritten Type/;
my $sql = "Select ".join(',',@items)." ".
"From Win32_NTLogEvent ".
"Where Logfile = 'System' ".
" and ( EventCode=6009 or EventCode=6006 )";
my $events =getEvents($sql);
my $enum = Win32::OLE::Enum->new($events);
my $sep = "";
while( defined(my $obj=$enum->Next)) {
print $sep,"\n";
printf "%15s : %s\n",$_,($obj->{$_}) ? $obj->{$_} : "(null)" for(@items);
$sep = '-' x 20;
}
これでVBScriptの豊富な例題プログラムを利用して取得したデータをPerlの正規表現やレポート機能を使って加工できる。うまく使えばお得だけど、両方知らないとメンテできない。
この記事へのコメント