下面是我当前的脚本:
$cpu = Get-WmiObject win32_processor | select LoadPercentage logwrite $cpu #this fuction writes $cpu into a .txt file
该文件的输出为:
@{LoadPercentage=4}
我希望它只是一个数字,这样我就可以进行计算。
kognpnkq1#
qbanet359's helpful answer在result对象上使用 * 直接属性访问*(.LoadPercentage),这是本例中最简单、最有效的解决方案。
.LoadPercentage
在PowerShell v3或更高版本中,这甚至适用于通过一个名为member-access enumeration的特性从对象的 * 集合 * 中提取属性值。例如,((Get-Date), (Get-Date).AddYears(-1)).Year在2019年运行时返回2019和2018,这两个值是数组中每个[datetime]示例的.Year属性值。如果确实要使用**Select-Object(或其内置别名select),例如当逐项处理 * 大型 * 输入集合时*:
((Get-Date), (Get-Date).AddYears(-1)).Year
2019
2018
[datetime]
.Year
Select-Object
select
要使用Select-Object提取单个属性 value,必须使用-ExpandProperty:
-ExpandProperty
Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage
背景:
默认情况下,Select-Object创建 * 自定义对象 *([pscustomobject]示例[1]),这些对象具有您通过-Property参数(可选隐式,作为第一个 * 位置 * 参数)指定的属性。即使在指定 single 属性[2]时也是如此,因此select LoadPercentage(缩写为:Select-Object -Property LoadPercentage)创建类似于以下对象的内容:
[pscustomobject]
-Property
select LoadPercentage
Select-Object -Property LoadPercentage
$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4
因为使用Add-Content写入日志文件,所以写入的是该自定义对象的.ToString()字符串表示,就像在可扩展字符串中使用该对象一样(尝试"$([pscustomobject] @{ LoadPercentage = 4 })")。相比之下,参数-ExpandProperty只能应用于 * 单个 * 属性,它 * 不 * 创建自定义对象,而是从输入对象返回该属性的 * 值 *。
Add-Content
.ToString()
"$([pscustomobject] @{ LoadPercentage = 4 })"
[1]严格地说,它们是[System.Management.Automation.PSCustomObject]示例,而类型加速器[pscustomobject],由于历史原因,容易混淆,指的是类型[System.Management.Automation.PSObject];参见this GitHub issue。[2]有一个hotly debated request on GitHub,它只使用一个属性来更改Select-Object的默认行为;虽然讨论令人感兴趣,但目前的行为不太可能改变。
[System.Management.Automation.PSCustomObject]
[System.Management.Automation.PSObject]
mec1mxoz2#
这是一个非常简单的修复方法。在运行Get-WmiObject时,不要选择LoadPercentage,而只需在调用函数时选择属性即可。这样只会将数字写入日志文件。
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
2条答案
按热度按时间kognpnkq1#
qbanet359's helpful answer在result对象上使用 * 直接属性访问*(
.LoadPercentage
),这是本例中最简单、最有效的解决方案。在PowerShell v3或更高版本中,这甚至适用于通过一个名为member-access enumeration的特性从对象的 * 集合 * 中提取属性值。
例如,
((Get-Date), (Get-Date).AddYears(-1)).Year
在2019年运行时返回2019
和2018
,这两个值是数组中每个[datetime]
示例的.Year
属性值。如果确实要使用**
Select-Object
(或其内置别名select
),例如当逐项处理 * 大型 * 输入集合时*:要使用
Select-Object
提取单个属性 value,必须使用-ExpandProperty
:背景:
默认情况下,
Select-Object
创建 * 自定义对象 *([pscustomobject]
示例[1]),这些对象具有您通过-Property
参数(可选隐式,作为第一个 * 位置 * 参数)指定的属性。即使在指定 single 属性[2]时也是如此,因此
select LoadPercentage
(缩写为:Select-Object -Property LoadPercentage
)创建类似于以下对象的内容:因为使用
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
的默认行为;虽然讨论令人感兴趣,但目前的行为不太可能改变。mec1mxoz2#
这是一个非常简单的修复方法。在运行
Get-WmiObject
时,不要选择LoadPercentage
,而只需在调用函数时选择属性即可。这样只会将数字写入日志文件。