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
}

そのため、何が起こっているかを示す 1 分間のスナップショットを取得したいと考えています。理由からこれを perfmon で開いているだけではありません。基本的に、前述の CSV ファイルでカンマ区切りの出力が得られると期待しています。単一の変数に対しては機能しますが、2 番目の変数またはテキストを追加しようとすると、次のエラーが発生します。

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

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

3

演算子を使用すると、+PowerShell は左側を調べて、式の結果の型を判断します。の左側に int が+表示され、右側に文字列 (int に変換できない) が表示されます。このようにしてみてください:

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

また、ヘッダーを記述する場所には、古い試行を上書きするために追加したくない場合があります。

"Processor Load, Available Memory(MB), Max Memory(Bytes)" > $path
于 2013-11-14T23:14:51.933 に答える
2

エラーは$a.loadpercentageint であるためです。次に、int と string を追加しようとしています。

1 つの回避策は、明示的に .ToString() を呼び出すことです。

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

もう 1 つの方法は、PowerShell 配列結合演算子です。簡単で、型は関係ありません。

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

さらに別の方法は、文字列フォーマッタを使用することです。これにより、各値の精度と表示を簡単に制御できます。

'{0},{1},{2}' -f $a.loadpercentage, $b.availableMbytes, $c.capacity
于 2013-11-14T23:15:26.260 に答える