2013-11-14 67 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