Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I write the value of a single property of a object?

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.

like image 583
verfluecht Avatar asked Feb 15 '18 12:02

verfluecht


People also ask

How do you assign a value to an object property?

assign() which is used to copy the values and properties from one or more source objects to a target object. It invokes getters and setters since it uses both [[Get]] on the source and [[Set]] on the target. It returns the target object which has properties and values copied from the target object.

What is the value of an object?

In computer science, a value object is a small object that represents a simple entity whose equality is not based on identity: i.e. two value objects are equal when they have the same value, not necessarily being the same object.

How do you define an object property?

Object properties are defined as a simple association between name and value. All properties have a name and value is one of the attributes linked with the property, which defines the access granted to the property. Properties refer to the collection of values which are associated with the JavaScript object.


2 Answers

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-access enumeration.

E.g., ((Get-Date), (Get-Date).AddYears(-1)).Year returns 2019 and 2018 when run in 2019, which are 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:

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

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:

$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4

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.

  • Note: If the value of that property happens to be an array (collection), its elements are output individually; that is, you'll get multiple outputs per 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.

like image 121
mklement0 Avatar answered Oct 08 '22 21:10

mklement0


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.

$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
like image 40
qbanet359 Avatar answered Oct 08 '22 20:10

qbanet359