2

Windowsの他の(perl.exeとは関係のない)プロセスに関する情報を取得するにはどうすればよいですか?

firefox.exeたとえば、すべてのプロセスに関する基本的な情報を監視したいスクリプトがあります。

私は次のようなことをしたいと思います:

#!perl -w
use warnings;
use strict;
use MagicModule qw/ read_process_info /;
use Data::Dumper;

my $ps = MagicModule::read_process_info();

print Dumper($ps);

そして、次のようなものを参照してください。

$VAR = [
    {
        ProcessName  => 'firefox.exe',
        PID          => 1234,
        PirvateBytes => 21153546,
        WorkingSet   => 134566354,
        # etc...
    },
    {
        ProcessName  => 'firefox.exe',
        PID          => 1556,
        PirvateBytes => 15435487,
        WorkingSet   => 245774448,
        # etc...
    },
    {
        ProcessName  => 'calc.exe',
        PID          => 2777,
        PirvateBytes => 1024,
        WorkingSet   => 4096,
        # etc...
    },
];

私はSystinternalsのPsExecからの出力を解析することによってこの情報を取得していましたが、明らかにこれはまったく効率的ではありません。

このデータを取得するためのPerlの優れた方法は何ですか?

(WindowsXPでStrawberryPerlを使用するソリューション-Windows7が推奨されます。)

4

1 に答える 1

5

WMIの使用Win32::OLEは、私が見た中で最も簡単な方法の1つです。

use Win32::OLE qw<in>;
use constant wbemFlagReturnImmediately => 0x10;
use constant wbemFlagForwardOnly => 0x20;

my $objWMIService 
    = Win32::OLE->GetObject( 'winmgmts:\\\\localhost\root\CIMV2' ) 
    or die 'WMI connection failed.\n'
    ;

my @processes  
    = in $objWMIService->ExecQuery( 
      'SELECT * FROM Win32_Process'
    , 'WQL'
    ,  wbemFlagReturnImmediately | wbemFlagForwardOnly
    );

そして、ここでオブジェクト定義を調べることができます。各フィールドには、ハッシュキーやメソッド名のようにアクセスできることに注意してください:($_->{Caption}または$_->Caption

于 2012-04-16T14:45:51.317 に答える