ハードなソフトの話

アクセスカウンタ

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

<<   作成日時 : 2009/07/03 00:20   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

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件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
PerlのプログラムにVBScriptを埋め込んで関数として使う ハードなソフトの話/BIGLOBEウェブリブログ
文字サイズ:       閉じる