so I have this table in variable $res
hostname OSshort freeGBonC
server1 w2k12 29,23
server2 w2k12 32,10
server3 w2k12 19,26
I can't seem to understand how to select lines with freeGBonC lower then some value. If I try
$res|where {$_.freeGBonC -lt 6}
it shows all lines! If I do -gt 6 it shows nothing! What kind of logic is this?
CodePudding user response:
I would assume the values on the property freeGBonC are of the type string hence why the comparison is showing unexpected results.
Try using this, I think it should work:
$csv = @'
"hostname","OSshort","freeGBonC"
"server1","w2k12","29,23"
"server2","w2k12","32,10"
"server3","w2k12","19,26"
'@ | ConvertFrom-Csv
$csv | Where-Object {[double]$_.freeGBonC.Replace(',','.') -lt 29}
Results:
hostname OSshort freeGBonC
-------- ------- ---------
server3 w2k12 19,26
I guess PowerShell is smart enough to compare the . Note that, string with a double as long as the double has the correct sign (.) so casting [double] or [decimal] is not even needed, is for arrays.
PS \> $csv.freeGBonC.ForEach({$_.Replace(',','.') -lt 29})
False
False
True
Thanks @mklement0 for pointing this out, it is in fact needed to cast [double] if the string is on the left hand side of the operator else we will get unwanted results:
'10.0' -lt 2 # => True
2 -gt '10.0' # => False
[double]'10.0' -lt 2 # => False
