提问人:verfluecht 提问时间:2/15/2018 最后编辑:verfluecht 更新时间:8/7/2023 访问量:6109
如何写入对象的单个属性的值?
How do I write the value of a single property of a object?
问:
这是我当前脚本的样子:
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
该文件的输出为:
@{LoadPercentage=4}
我希望它只是数字,以便我可以进行计算。
答:
这是一个非常简单的修复方法。无需在运行时选择 ,只需在调用函数时选择属性即可。这只会将数字写入日志文件。LoadPercentage
Get-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
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 LoadPercentage
ForEach-Object { $_.LoadPercentage }
背景资料:
默认情况下,Select-Object
创建自定义对象 ( instances[1] ),这些对象具有您通过参数指定的属性(可选地隐式,作为第一个位置参数)。[pscustomobject]
-Property
即使在指定单个属性[2]时,这也适用,因此(缩写:)创建类似于以下对象的内容:select LoadPercentage
Select-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
的默认行为;虽然讨论很有趣,但目前的行为不太可能改变。
评论