Frage

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

War es hilfreich?

Lösung

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

Andere Tipps

The error is because $a.loadpercentage is an int. You are then trying to add an int and a string.

One workaround is to explicitly call .ToString()

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

Another way is the PowerShell array join operator. It is quick easy, and types do not matter:

($a.loadpercentage, $b.availableMbytes, $c.capacity) -join "," |
    Add-Content $path

Yet another way is with a string formatter. This will easily let you control the precision and display of each value:

'{0},{1},{2}' -f $a.loadpercentage, $b.availableMbytes, $c.capacity
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top