如何写入对象的单个属性的值?

时间:2018-02-15 12:56:21

标签: powershell logfile get-wmiobject select-object

这是我当前脚本的样子:

$cpulogpath = "C:\Monitoring\$date.csv"
function logwrite
{
param ([string]$logstring)
add-content $cpulogpath -value $logstring
}

$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu

文件的输出是:

@{LoadPercentage=4}

我希望它只是数字,以便我可以进行计算。

2 个答案:

答案 0 :(得分:5)

这是一个非常简单的修复。在运行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

答案 1 :(得分:4)

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