使用“LoadPercentage”进行性能监控

时间:2018-03-27 08:49:28

标签: powershell powershell-v5.0

我正在尝试使用从WMI-Object检索的值来设置性能监视的标准。

以下是我使用的代码:

$CPULoad = Get-WMIObject -computername $computer win32_processor | `
           Measure-Object -Property LoadPercentage -Average | `
           Select Average

$WarningCPU = ($CPULoad * 0.8)

If ($CPULoad -ge $WarningCPU){
    [System.Windows.Forms.MessageBox]::Show("CPU Usage is over 80%","Warning","Ok","Warning")
}

我想通过使用这些代码将cpu使用率保持在80%的限制,但是这出现了:

  

方法调用失败,因为[System.Management.Automation.PSObject]不包含名为“op_Multiply”的方法。

     

无法将“@ {Average = 14}”与“50”进行比较,因为对象类型不同或“@ {Average = 14}”对象未实现“IComparable”。

有没有办法让值“具有可比性”,以便当用户的cpu使用量达到> 80%时,消息框会显示?

1 个答案:

答案 0 :(得分:1)

就像@ arco444所说,用| Select -ExpandProperty Average来解决你的问题。这会让你的错误消失。

我只是想扩大问题和类型的重要性。

类型

您在代码中遇到的问题是,您从Average返回的Measure-Object属性不是“数字”。它看起来像一个,但类型不是你可以用来计算的东西。

请记住,PowerShell cmdlet返回对象并将它们放在管道中。它们可能看起来像数字和文字,但可能是完全不同的东西。

您可以通过cmdlet Get-Member来管理结果,或者如果您更喜欢别名gm,则可以检查PowerShell cmdlet返回的属性和类型。

运行

Get-WMIObject -computername $computer win32_processor | `
           Measure-Object -Property LoadPercentage -Average | `
           Select Average | `
           Get-Member

会告诉您平均值有类型

TypeName: Selected.Microsoft.PowerShell.Commands.GenericMeasureInfo

GenericMeasureInfo无法使用计算。

但是,它会告诉您有一个名为Average的属性为double的属性。

Double很好,你可以用来计算:)

使用Select-Object -ExpandProperty

提取属性

现在的问题是必须从对象中提取它。这是Select -ExpandObject发挥作用的地方。

它接受一个属性并从父对象中提取它,保留其类型。

正在运行

Get-WMIObject -computername $computer win32_processor | `
           Measure-Object -Property LoadPercentage -Average | `
           Select -ExpandProperty Average | `
           Get-Member

告诉你现在的类型是

TypeName: System.Double

现在计算工作:)