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

How do I write the value of a single property of a object?

提问人:verfluecht 提问时间:2/15/2018 最后编辑:verfluecht 更新时间:8/7/2023 访问量:6109

问:

这是我当前脚本的样子:

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

该文件的输出为:

@{LoadPercentage=4}

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

PowerShell 日志文件 Get-WMIobject 选择对象

评论


答:

7赞 qbanet359 2/15/2018 #1

这是一个非常简单的修复方法。无需在运行时选择 ,只需在调用函数时选择属性即可。这只会将数字写入日志文件。LoadPercentageGet-WmiObject

$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
15赞 mklement0 2/15/2018 #2

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

在 PowerShell v3+ 中,这甚至适用于通过称为成员访问枚举的功能从对象集合(数组、列表)中提取属性值

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


如果确实要使用 Select-Object(或其内置别名),例如在逐项处理大型输入集合时,以便利用可能对内存友好的流式处理select

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

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

正如 zett42 所指出的,使用具有简化语法ForEach-Object 是另一种选择,当使用内置别名时,它提供了一个简洁的解决方案,便于交互使用:%

# Short for: ForEach-Object -MemberName LoadPercentage
# which in turn is equivalent to: ForEach-Object { $_.LoadPercentage }
Get-WmiObject win32_processor | % LoadPercentage
  • 顺便说一句,性能(在大多数情况下可能无关紧要):令人惊讶的是,
    至少比
    PowerShell 7.3.4(撰写本文时的当前版本);请参阅 GitHub 问题 #7700
    ForEach-Object -MemberName LoadPercentageForEach-Object { $_.LoadPercentage }

背景资料:

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

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

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

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

相比之下,参数 (只能应用于单个属性) 不会创建自定义对象,而是从输入对象返回该属性的-ExpandProperty

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

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

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