使用Perl获取WMI CPU值
我正在尝试使用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' =>
Win32\u performatteddata\u PerfOS\u处理器
,我总是得到它们不变的相同值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
?如果在计算机不忙的时候运行脚本呢?