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 方法来获取这些数据?

(在 Windows XP 上使用 Strawberry Perl 的解决方案——Windows 7 将是首选。)

4

1 回答 1

5

WMI 使用Win32::OLE是我见过的最简单的方法之一:

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 回答