如何写一个对象的单个 属性 的值?
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-WmiObject
时 LoadPercentage
中的 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)).Year
returns2019
和2018
,即.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
的默认行为,只需要一个 属性;虽然讨论很有趣,但目前的行为不太可能改变。
这是我当前脚本的样子:
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
文件的输出是:
@{LoadPercentage=4}
我希望它只是数字,以便我可以进行计算。
这是一个非常简单的修复。当 运行 Get-WmiObject
时 LoadPercentage
中的 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)).Year
returns2019
和2018
,即.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
的默认行为,只需要一个 属性;虽然讨论很有趣,但目前的行为不太可能改变。