2011-01-20 73 views
1

我在嘗試去使用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

回答

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 % 
0

編輯,使答案更準確:

檢索這些類 Win32::OLE->GetObject(...)的情況下,讓你一快照處理器的當前狀態。要查看處理器狀態隨時間變化的情況,您需要 獲得單獨的實例 分別在不同的時間撥打Win32::OLE->GetObject

+1

我已經做了一個循環,總是得到新的實例,結果是相似的....這不會解決。你測試了腳本嗎? – 2011-01-20 17:56:55