使用Perl获取WMI CPU值

时间:2011-01-20 17:42:08

标签: perl wmi

我正在尝试使用WMI类获取CPU值,但没有幸运。

  1. 使用班级Win32_PerfFormattedData_PerfOS_Processor,我总是得到他们不会改变的相同值...
  2. 使用WMI类Win32_PerfRawData_PerfOS_ProcessorPercentProcessorTime的值等于PercentProcessorTime,有些错误。

  3. #!/usr/bin/perl -w
    use strict;
    use warnings;
    
    use Win32::OLE;
    use Data::Dumper;
    
    my $class = "Win32_PerfFormattedData_PerfOS_Processor";
    my $key = 'Name';
    
    my @properties = qw(PercentIdleTime PercentProcessorTime PercentPrivilegedTimePercentUserTime PercentInterruptTime);
    my $wmi = Win32::OLE->GetObject("winmgmts://./root/cimv2")
        or die "Failed getobject\n";
    
    my $list, my $v;
    
    $list = $wmi->InstancesOf("$class")
        or die "Failed getobject\n";
    my $hash;
    foreach $v (in $list) {        
        $hash->{$v->{$key}}->{$_}  = $v->{$_} for @properties;
    }
    
    print Dumper $hash;
    
    #-------------------
    # Using Otehr class    
    $class = 'Win32_PerfRawData_PerfOS_Processor';
    
    $wmi = Win32::OLE->GetObject("winmgmts://./root/cimv2")
        or die "Failed getobject\n";
    
    $list = $wmi->InstancesOf("$class")
        or die "Failed getobject\n";
    foreach $v (in $list) {        
        $hash->{$v->{$key}}->{$_}  = $v->{$_} for @properties;
    }
    
    print Dumper $hash;
    

    输出:

    $VAR1 = {
              '0' => {
                       'PercentPrivilegedTime' => '0',
                       'PercentIdleTime' => '0',
                       'PercentInterruptTime' => '0',
                       'PercentUserTime' => '0',
                       'PercentProcessorTime' => '100'
                     },
              '_Total' => {
                            'PercentPrivilegedTime' => '0',
                            'PercentIdleTime' => '0',
                            'PercentInterruptTime' => '0',
                            'PercentUserTime' => '0',
                            'PercentProcessorTime' => '100'
                          }
            };
    $VAR1 = {
              '0' => {
                       'PercentPrivilegedTime' => '15442905808',
                       'PercentIdleTime' => '2505024948976',
                       'PercentInterruptTime' => '1866684160',
                       'PercentUserTime' => '682681648',
                       'PercentProcessorTime' => '2505024948976'
                     },
              '_Total' => {
                            'PercentPrivilegedTime' => '15442905808',
                            'PercentIdleTime' => '2505024948976',
                            'PercentInterruptTime' => '1866684160',
                            'PercentUserTime' => '682681648',
                            'PercentProcessorTime' => '2505024948976'
                          }
            };
    

2 个答案:

答案 0 :(得分:1)

这是我收集CPU信息的脚本:

use strict;
use warnings;

use Win32::OLE;


my $interval = 1;
my $key = 'Name';
my @properties = qw(PercentIdleTime PercentProcessorTime PercentPrivilegedTime PercentUserTime PercentInterruptTime TimeStamp_Sys100NS);

my $hash1 = {};

my $wmi = Win32::OLE->GetObject("winmgmts://./root/cimv2")
    or die "Failed to get object\n";


my $list = $wmi->InstancesOf('Win32_PerfRawData_PerfOS_Processor')
    or die "Failed to get instance object\n";

my $v;  
foreach $v (in $list) {         
        map{$hash1->{$v->{$key}}->{$_}  = $v->{$_} }@properties;
}

while(sleep 1){

    $list = $wmi->InstancesOf('Win32_PerfRawData_PerfOS_Processor')
        or die "Failed to get instance object\n";

    my $hash = {};
    foreach $v (in $list) {         
        map{$hash->{$v->{$key}}->{$_}  = $v->{$_} }@properties;
    }

    my $cpu_time = sprintf("%.2f", (1 - get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentProcessorTime' )) * 100);
    my $cpu_idle = sprintf("%.2f", 100-$cpu_time);
    my $cpu_user = sprintf("%.2f", get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentUserTime' )* 100);
    my $cpu_priv = sprintf("%.2f", get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentPrivilegedTime' )* 100);
    my $cpu_int = sprintf("%.2f", get_value($hash1->{'_Total'}, $hash->{'_Total'}, 'PercentInterruptTime' )* 100);      
    printf "CPU Time %s %% , privileged %s %% , user %s %%, interrupt %s %%\n", $cpu_time,$cpu_priv,$cpu_user,$cpu_int;

    $hash1 = $hash;
}


exit;

sub get_value {
    my $h1 = shift;
    my $h2 = shift;
    my $property = shift;
    return (($h2->{$property} - $h1->{$property})/($h2->{'TimeStamp_Sys100NS'}-$h1->{'TimeStamp_Sys100NS'}));
}

输出样本:

CPU Time 2.03 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.87 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.16 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.76 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.19 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.77 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.98 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 1.93 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.08 % , privileged 1.96 % , user 0.00 %, interrupt 0.00 %
CPU Time 2.84 % , privileged 2.94 % , user 0.00 %, interrupt 0.00 %

答案 1 :(得分:0)

编辑以使答案更精确:

检索这些类的实例 Win32::OLE->GetObject(...)可以获得当前处理器状态的快照。要了解处理器状态如何随时间变化,您需要处获取单独的实例,在不同时间单独调用Win32::OLE->GetObject