使用Perl获取WMI CPU值

问题描述:

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

  1. 随着类Win32_PerfFormattedData_PerfOS_Processor,我一直都想与他们不改变的相同值...
  2. 随着WMI Win32_PerfRawData_PerfOS_Processor类的PercentProcessorTime的值等于PercentProcessorTime,什么是错的。

#!/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; 

OUTPUT:

$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

`-w`和`使用warnings`在这种情况下是多余的。 `-w`是全局的,而'use warnings`编译指示可以在块内启用和禁用,或者``无警告`。 – 2011-01-20 17:48:18

这是我对我所做的收集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 % 

编辑,使答案更准确:

检索这些类 Win32::OLE->GetObject(...)的情况下,让你一快照处理器的当前状态。要查看处理器状态随时间变化的情况,您需要 获得单独的实例 分别在不同的时间拨打Win32::OLE->GetObject

+1

我已经做了一个循环,总是得到新的实例,结果是相似的....这不会解决。你测试了脚本吗? – 2011-01-20 17:56:55