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

oni*_*iji 5 powershell logfile select-object get-wmiobject

这是我当前的脚本的样子:

$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
Run Code Online (Sandbox Code Playgroud)

该文件的输出为:

@{LoadPercentage=4}
Run Code Online (Sandbox Code Playgroud)

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

mkl*_*nt0 6

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
Run Code Online (Sandbox Code Playgroud)

背景

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

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

$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4
Run Code Online (Sandbox Code Playgroud)

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

相反,-ExpandProperty只能应用于单个属性的parameter 不会创建自定义对象,而是从输入对象返回该属性的

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

[1]严格来说,它们是[System.Management.Automation.PSCustomObject]实例,而出于历史原因,类型加速器[pscustomobject]令人困惑地是指类型[System.Management.Automation.PSObject];请参阅此GitHub问题

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


小智 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
Run Code Online (Sandbox Code Playgroud)