Concatenating PowerShell variables

user2994110 picture user2994110 · Nov 14, 2013 · Viewed 10k times · Source
$timeout = new-timespan -Minutes 1
$sw = [diagnostics.stopwatch]::StartNew()
$path = "d:\powershell\test.csv"

"Processor Load, Available Memory(MB), Max Memory(Bytes)" >> $path

while ($sw.elapsed -lt $timeout)
{
    $a = gwmi -query "Select * from win32_processor"
    $b = gwmi -query "Select * from win32_perfrawdata_perfOS_memory"
    $c = gwmi -query "Select * from win32_physicalmemory"
    $date = Get-Date -format s

    $a.loadpercentage + "," + $b.availableMbytes + "," + $c.capacity >> $path
    start-sleep -seconds 5
}

So I'm just looking to get a minute long snapshot of what's going on. I'm not just opening this in perfmon for reasons. Basically I'd expect to get a comma-delimited output in the CSV file mentioned. It works for a single variable, but when I try to add a second variable, or text I get the following error.

Cannot convert value ", test" to type "System.Int32". Error: "Input string was not in a
correct format."
At D:\powershell\VDIPerfMon.ps1:14 char:21
+     $a.loadpercentage + <<<<  ", test" >> $path
+ CategoryInfo          : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

How can I fix this problem?

Answer

Keith Hill picture Keith Hill · Nov 15, 2013

When you use the + operator PowerShell looks on the left hand side to determine the resulting type of the expression. It is seeing an int on the left of the + and a string (that can't be converted to an int) on the right. Try it this way:

"$($a.loadpercentage), $($b.availableMbytes), $($c.capacity)" >> $path

Also where you write your headers, you might not want to append i.e. in order to overwrite old attempts:

"Processor Load, Available Memory(MB), Max Memory(Bytes)" > $path