PerlのプログラムにVBScriptを埋め込んで関数として使う

Windowsでログの解析やシステム管理をしていると、WMIとか使いたくなる。
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の正規表現やレポート機能を使って加工できる。うまく使えばお得だけど、両方知らないとメンテできない。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック