6

这是我当前脚本的样子:

$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file

文件的输出是:

@{LoadPercentage=4}

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

4

2 回答 2

12

qbanet359 的有用答案在结果对象上使用直接属性访问(.LoadPercentage),这是在这种情况下最简单和最有效的解决方案。

在 PowerShell v3 或更高版本中,这甚至可以通过称为成员枚举的功能从对象集合中提取属性值

例如,((Get-Date), (Get-Date).AddYears(-1)).Year返回20192018在 2019 年运行时,它们是数组中.Year每个实例的属性值。[datetime]


如果您确实想使用Select-Object(或其内置别名select),例如在逐项处理大型输入集合时:

要使用Select-Object提取单个属性,您必须使用-ExpandProperty

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

背景

Select-Object默认情况下,创建 具有您通过参数指定的属性的自定义对象[pscustomobject]实例[1]-Property ) (可选地隐式地,作为第一个参数)。

这即使在指定单个属性[2]时也适用,因此select LoadPercentage(简称Select-Object -Property LoadPercentage:)创建类似于以下对象的内容:

$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4

因为您用于Add-Content写入日志文件,所以它是.ToString()写入的自定义对象的字符串表示,如果您在可扩展字符串中使用该对象(try "$([pscustomobject] @{ LoadPercentage = 4 })"),您会得到。

相比之下,-ExpandProperty仅可应用于单个属性的 parameter不会创建自定义对象,而是从输入对象返回该属性的

  • 注意:如果该属性的值恰好是一个数组(集合),则其元素将单独输出;也就是说,您将获得每个输入对象的多个输出。

[1] 严格来说,它们是[System.Management.Automation.PSCustomObject]实例,而 type 加速器由于历史原因而[pscustomobject]令人困惑地指代 type [System.Management.Automation.PSObject];看到这个 GitHub 问题

[2] GitHub 上有一个激烈争论的请求,Select-Object即只用一个属性更改的默认行为;虽然讨论很有趣,但目前的行为不太可能改变。

于 2018-02-15T14:13:38.707 回答
7

这是一个非常简单的修复。运行 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
于 2018-02-15T13:10:08.553 回答