windows - 获取有关 Windows 上其他进程的信息

标签 windows perl process

如何获取有关 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 是首选。)

最佳答案

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

然后可以查阅对象定义here 。请记住,每个字段都可以像哈希键或方法名称一样进行访问:( $_->{Caption}$_->Caption )

关于windows - 获取有关 Windows 上其他进程的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175667/

相关文章:

Perl 长数据类型

c# - 如何在特定进程运行时将程序发送到后台

windows - 回显文字字符串?

perl - 如何在单行上打印某些起始行和终止行之间的所有内容?

linux - 在 Windows 10 与 Ubuntu Linux 和本地与云上使用 Chrome 驱动程序进行并行测试的 Selenium Webdriver 性能

Linux Perl - 打印其脚本名称的脚本?

java - 如何从 "B"jar 启动 "A"jar 并在 "B"中监视 "A"?

c++ - 如何检测使用 LoadLibraryEx 加载的模块

Windows CMD 解释别名后的代码

windows - 如何在包含引号 ( "") 的批处理文件中运行命令?