This is how my current script looks like:
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
The output of the file is:
@{LoadPercentage=4}
I want it to be only the number so that I can make calculations.
qbanet359's helpful answer uses direct property access (
.LoadPercentage
) on the result object, which is the simplest and most efficient solution in this case.In PowerShell v3 or higher this even works with extracting property values from a collection of objects, via a feature called member enumeration.
E.g.,
((Get-Date), (Get-Date).AddYears(-1)).Year
returns2019
and2018
when run in 2019, the.Year
property values from each[datetime]
instance in the array.In cases where you do want to use
Select-Object
(or its built-in alias,select
), such as when processing a large input collection item by item:To use
Select-Object
to extract a single property value, you must use-ExpandProperty
:Background:
Select-Object
by default creates custom objects ([pscustomobject]
instances[1] ) that have the properties you specify via the-Property
parameter (optionally implicitly, as the 1st argument).This applies even when specifying a single property[2], so that
select LoadPercentage
(short for:Select-Object -Property LoadPercentage
) creates something like the following object:Because you use
Add-Content
to write to your log file, it is the.ToString()
string representation of that custom object that is written, as you would get if you used the object in an expandable string (try"$([pscustomobject] @{ LoadPercentage = 4 })"
).By contrast, parameter
-ExpandProperty
, which can be applied to a single property only, does not create a custom object and instead returns the value of that property from the input object.[1] Strictly speaking, they're
[System.Management.Automation.PSCustomObject]
instances, whereas type accelerator[pscustomobject]
, confusingly, refers to type[System.Management.Automation.PSObject]
, for historical reasons; see this GitHub issue.[2] There's a hotly debated request on GitHub to change
Select-Object
's default behavior with only a single property; while the discussion is interesting, the current behavior is unlikely to change.That is a pretty simple fix. Instead of selecting the LoadPercentage when running Get-WmiObject just select the property when calling your function. This will write only the number to your log file.