使用Perl获取WMI CPU值

使用Perl获取WMI CPU值,perl,wmi,Perl,Wmi,我正在尝试使用WMI类获取CPU值,但没有幸运 使用类Win32\u performatteddata\u PerfOS\u处理器,我总是得到它们不变的相同值 使用WMI类Win32 PerfRawData PerfOS处理器,PercentProcessorTime的值等于PercentProcessorTime,出现问题 输出: $VAR1 = { '0' => { 'PercentPrivilegedTime' =>

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

  • 使用类
    Win32\u performatteddata\u PerfOS\u处理器
    ,我总是得到它们不变的相同值
  • 使用WMI类Win32 PerfRawData PerfOS处理器,
    PercentProcessorTime
    的值等于
    PercentProcessorTime
    ,出现问题

  • 输出:

    $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'
                          }
            };
    

    编辑以使答案更精确:


    检索这些类的实例可以获得处理器当前状态的快照。要查看处理器状态随时间的变化,您需要在不同的时间分别调用
    Win32::OLE->GetObject
    ,以获取不同的实例。

    编辑以使答案更精确:


    检索这些类的实例可以获得处理器当前状态的快照。要查看处理器状态随时间的变化,您需要在不同的时间分别调用
    Win32::OLE->GetObject
    ,以获取不同的实例。

    这是我收集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 %
    

    这是我用来收集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 %
    

    -w
    使用警告在这种情况下是多余的<代码>-w
    是全局的,而
    使用警告
    可以在块内启用和禁用pragma,或者通过
    无警告
    -w
    使用警告
    在这种情况下是多余的
    -w
    是全局的,而
    使用警告
    可以在块内启用和禁用pragma,或者通过
    无警告
    来启用和禁用pragma。我做了一个循环,总是得到新的实例,结果类似。。。。那不会是索尔维特。你测试脚本了吗?@golden-PT:Answer-edited。确保对
    GetObject(…)
    的调用也在循环中。对于第一次转储,我得到的值总是相同的。\n您的意思是总是得到
    PercentProcessorTime=>100
    ?如果在计算机不忙的时候运行脚本呢?我做了一个循环,总是得到新的实例,结果是相似的。。。。那不会是索尔维特。你测试脚本了吗?@golden-PT:Answer-edited。确保对
    GetObject(…)
    的调用也在循环中。对于第一次转储,我得到的值总是相同的。\n您的意思是总是得到
    PercentProcessorTime=>100
    ?如果在计算机不忙的时候运行脚本呢?