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

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}

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

这是一个非常简单的修复。当 运行 Get-WmiObjectLoadPercentage 中的 select 调用函数时,只需 select 中的 属性 即可。这只会将号码写入您的日志文件。

$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

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

在 PowerShell v3 或更高版本中,这甚至可以通过一个功能从对象集合中提取属性值称为 member-access enumeration.

例如2019年运行时((Get-Date), (Get-Date).AddYears(-1)).Yearreturns20192018,即.Year来自数组中每个 [datetime] 个实例的 属性 个值。


在您确实想使用 Select-Object(或其内置别名 select)的情况下,例如当 逐项处理输入集合:

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

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

背景:

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

这甚至在指定 single 属性[2] 时也适用,因此 select LoadPercentage(短for: Select-Object -Property LoadPercentage) 创建类似于以下对象的内容:

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

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

相比之下,仅可应用于 单个 属性 的参数 -ExpandProperty 不会 创建一个自定义对象,而不是 returns 来自输入对象的那个 属性 的

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

[1] 严格来说,它们是 [System.Management.Automation.PSCustomObject] 实例,而类型加速器 [pscustomobject] 令人困惑地指的是类型 [System.Management.Automation.PSObject],这是出于历史原因;见 this GitHub issue.

[2] 有一个 hotly debated request on GitHub 可以改变 Select-Object 的默认行为,只需要一个 属性;虽然讨论很有趣,但目前的行为不太可能改变。