我正在尝试使用从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%时,消息框会显示?
答案 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 -ExpandObject
发挥作用的地方。
它接受一个属性并从父对象中提取它,保留其类型。
正在运行
Get-WMIObject -computername $computer win32_processor | `
Measure-Object -Property LoadPercentage -Average | `
Select -ExpandProperty Average | `
Get-Member
告诉你现在的类型是
TypeName: System.Double
现在计算工作:)