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

x33g5p2x  于 2023-01-17  发布在  Shell
关注(0)|答案(2)|浏览(102)

下面是我当前的脚本:

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

该文件的输出为:

@{LoadPercentage=4}

我希望它只是一个数字,这样我就可以进行计算。

kognpnkq

kognpnkq1#

qbanet359's helpful answer在result对象上使用 * 直接属性访问*(.LoadPercentage),这是本例中最简单、最有效的解决方案。

在PowerShell v3或更高版本中,这甚至适用于通过一个名为member-access enumeration的特性从对象的 * 集合 * 中提取属性值。
例如,((Get-Date), (Get-Date).AddYears(-1)).Year在2019年运行时返回20192018,这两个值是数组中每个[datetime]示例的.Year属性值。
如果确实要使用**Select-Object(或其内置别名select),例如当逐项处理 * 大型 * 输入集合时*:

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

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

背景

默认情况下,Select-Object创建 * 自定义对象 *([pscustomobject]示例[1]),这些对象具有您通过-Property参数(可选隐式,作为第一个 * 位置 * 参数)指定的属性。
即使在指定 single 属性[2]时也是如此,因此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
[2]有一个hotly debated request on GitHub,它只使用一个属性来更改Select-Object的默认行为;虽然讨论令人感兴趣,但目前的行为不太可能改变。

mec1mxoz

mec1mxoz2#

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

相关问题