Как мне записать значение одного свойства объекта?

Вот как выглядит мой текущий скрипт:

$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.

Другие вопросы по тегам