这是我当前脚本的样子:
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
该文件的输出是:
@{LoadPercentage=4}
我希望它只是数字,以便我可以进行计算。
这是一个非常简单的修复。在运行Get-WmiObject时,只需在调用函数时选择属性,而不是选择LoadPercentage。这只会将数字写入您的日志文件。
$cpulogpath = "C:\Monitoring\$date.csv"
function logwrite
{
param ([string]$logstring)
add-content $cpulogpath -value $logstring
}
$cpu = Get-WmiObject win32_processor #don't select the property here
logwrite $cpu.LoadPercentage #select it here
qbanet359's helpful answer对结果对象使用直接属性访问(.LoadPercentage
),这是本例中最简单,最有效的解决方案。
在PowerShell v3或更高版本中,这甚至可以通过名为member enumeration的功能从一组对象中提取属性值。
如果您确实想要使用Select-Object
(或其内置别名,select
),例如在逐项处理大型输入集合时:
要使用Select-Object
提取单个属性值,必须使用-ExpandProperty
:
Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage
背景:
Select-Object
默认创建自定义对象([pscustomobject]
实例[1]),它们具有您通过-Property
参数指定的属性(可选地隐式地,作为第一个参数)。
这甚至在指定单个属性时也适用,因此select LoadPercentage
(简称:Select-Object -Property LoadPercentage
)会创建类似以下对象的内容:
$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4
因为您使用Add-Content
写入日志文件,所以它是写入的自定义对象的.ToString()
字符串表示形式,如果您在可扩展字符串中使用该对象(请尝试"$([pscustomobject] @{ LoadPercentage = 4 })"
)。
相比之下,参数-ExpandProperty
(仅可应用于单个属性)不会创建自定义对象,而是从输入对象返回该属性的值。
[1]严格来说,它们是[System.Management.Automation.PSCustomObject]
实例,而类型加速器[pscustomobject]
,令人困惑,指的是[System.Management.Automation.PSObject]
类型,由于历史原因;见this GitHub issue。