2012-04-17 21 views
2

バッチスクリプトで "test.exe"という名前のすべてのプログラムの使用メモリを合計したいと思います。私はすべての適切なプロセスのメモリ使用量を取得するには、次のコマンドを使用することができますので、Windows + wmic + memory

C:\> wmic process where name="test.exe" get workingsetsize | findstr /v "WorkingSetSize" 
55758848 
66174976 

、私はFORループと一緒にすべてのそれらの値を合計したいと思います。次のコマンドはi変数を表示するだけですが、それにもかかわらずエラーが表示されます。

C:\> for /F %i IN ('wmic process where name="test.exe" get workingsetsize ^| findstr /v "WorkingSetSize"') DO echo %i 
test.exe - Invalid alias verb. 

は、どのように私はすべての使用とともにメモリや出力、それを合計すると、そのコマンドを変更することができますし、それは私の命令に好ましくは非常によく似た、CMDに働かなければなりません。 =はトークン区切り文字であり、それはバッチパーサによって取り除かなっているので、

おかげ

答えて

7

あなたのFOR文は失敗しています。あなたが^=としてそれをエスケープするとうまくいくでしょう。

WMICには、出力がパイプされるたびに、出力の各行の末尾に余分な改行文字(0x0D)と出力の最後に余分な行が含まれているという不都合な「機能」があります。これにより、FORループ内の不必要な行に問題が発生する可能性があります。 FINDSTRを変更してヘッダー行がなくても、少なくとも1桁の数字を探すようにすれば、簡単に解決できます。

合計を得るには、単純にループ内でSET変数を初期化した後でSET/Aを使用します。

>set SUM=0 
>for /F %i IN ('wmic process where name^="test.exe" get workingsetsize ^| findstr "[0-9]"') DO set /a SUM+=%i 

しかし - WindowsのCMDでの数学は、符号付き整数のサポートを32ビットに制限されています。あなたの合計は、最大許容値2,147,483,647を簡単に超える可能性があります。 PowerShellやVBSやJScriptプログラムを実行するのにCSCRIPTを使う方が良いでしょう。これらの選択肢はすべて、長い整数(64ビット)をサポートしています。

+0

ありがとう、魅力のように動作します:) – eleanor

+0

+1:一口!私は人々が実際にあなたが最後に与えるもののような良いアドバイスを取ることを望みます... –

+1

WorkingSetSizeは常に1024バイト(= 1 KiB)の倍数です。 2 GiBでのオーバーフローを避けるために、KiBの合計を計算することができます: "set/a SUM + =%i/1024"。 PageFileUsage(すでにKiBにある)を合計すると、共有メモリページが何度もカウントされないため、より関連性が高いことにも注意してください。 – Antosha