Как мне записать значение одного свойства объекта?
Вот как выглядит мой текущий скрипт:
$cpulogpath = "C:\Monitoring\$date.csv"
function logwrite
{
param ([string]$logstring)
add-content $cpulogpath -value $logstring
}
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu
Выходные данные файла:
@{LoadPercentage=4}
Я хочу, чтобы это было только число, чтобы я мог делать вычисления.
2 ответа
Это довольно простое решение. Вместо выбора 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 использует прямой доступ к свойству объекта результата, который является самым простым и эффективным решением в этом случае.
В тех случаях, когда вы хотите использовать Select-Object
(или его встроенный псевдоним, select
), например, при обработке большого элемента входной коллекции по элементам:
Использовать Select-Object
чтобы извлечь одно значение свойства, вы должны использовать -ExpandProperty
:
Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage
Фон:
Select-Object
по умолчанию создает пользовательские объекты ([pscustomobject]
экземпляры [1]), которые имеют свойства, которые вы указываете через -Property
параметр (опционально неявно, как 1-й аргумент).
Это применимо даже при указании одного свойства, так что select LoadPercentage
(Короче для: Select-Object -Property LoadPercentage
) создает что-то вроде следующего объекта:
$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4
Потому что вы используете Add-Content
чтобы записать в ваш файл журнала, это .ToString()
строковое представление этого пользовательского объекта, который написан, как вы получили бы, если бы вы использовали объект в расширяемой строке (попробуйте "$([pscustomobject] @{ LoadPercentage = 4 })"
).
В отличие от параметра -ExpandProperty
, который может быть применен только к одному свойству, не создает пользовательский объект и вместо этого возвращает значение этого свойства из входного объекта.
[1] Строго говоря, они [System.Management.Automation.PSCustomObject]
экземпляры, тогда как тип ускоритель [pscustomobject]
, смущает, относится к типу [System.Management.Automation.PSObject]
по историческим причинам; увидеть эту проблему GitHub.