2013-11-14 135 views
3
$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 
} 

因此,我只是想獲取有關正在發生的事情的分鐘快照。我不只是因爲理由而在perfmon中打開它。基本上我希望在提到的CSV文件中得到以逗號分隔的輸出。它適用於單個變量,但是當我嘗試添加第二個變量或文本時,出現以下錯誤。連接PowerShell變量

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 

我該如何解決這個問題?

+0

我使用PowerShell的連接運算符'-j'給了一個簡單的答案,但我會建議使用哈希表創建一個自定義對象,然後將其發送到Export-CSV – Eris

回答

3

當您使用+運算符時,PowerShell將在左側查找以確定表達式的結果類型。它在+的左邊看到一個int,在右邊看到一個字符串(不能轉換爲int)。試着這樣說:

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

而且你寫你的頭,你可能不希望追加即以覆蓋舊的嘗試:

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

這工作得非常好。非常感謝,並感謝關於'+'的解釋。對於Powershell來說,這是令人沮喪的,因爲劇本的其餘部分像我想要的那樣工作。 – user2994110

2

這個錯誤是因爲$a.loadpercentage是一個int。然後你試圖添加一個int和一個字符串。

一種解決方法是顯式調用的ToString()

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

另一種方式是PowerShell的陣列連接操作。它很容易,並且類型無關緊要:

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

另一種方法是使用字符串格式化程序。這將讓你輕鬆控制每個值的精度和顯示:

'{0},{1},{2}' -f $a.loadpercentage, $b.availableMbytes, $c.capacity