Windows + wmic + память

Я хотел бы суммировать используемую память всех программ с именем «test.exe» в пакетном сценарии. Я могу использовать следующую команду, чтобы получить использование памяти всеми соответствующими процессами:

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, желательно очень похоже на мою команду.

Спасибо


person eleanor    schedule 17.04.2012    source источник


Ответы (1)


Ваш оператор FOR не работает, потому что = является разделителем токенов, и он удаляется пакетным синтаксическим анализатором. Это сработает, если вы экранируете его как ^=.

У WMIC есть неприятная «особенность», заключающаяся в том, что всякий раз, когда его вывод передается по конвейеру, он включает дополнительный символ возврата каретки (0x0D) в конце каждой строки вывода, а также дополнительную строку в конце вывода. Это может вызвать проблемы с дополнительными нежелательными строками в вашем цикле FOR. Ваша ситуация легко решается путем изменения FINDSTR для поиска хотя бы одной цифры вместо отсутствия строки заголовка.

Чтобы получить сумму, вы просто используете SET/A в своем цикле (после первой инициализации переменной SUM).

>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 или CSCRIPT для выполнения программы VBS или JScript. Все эти альтернативы поддерживают длинные целые числа (64 бита).

person dbenham    schedule 17.04.2012
comment
+1: Вздох! Я бы хотел, чтобы люди действительно прислушивались к хорошим советам, подобным тому, который вы даете в конце... - person Christian.K; 23.04.2012
comment
Размер рабочего набора всегда кратен 1024 байтам (= 1 КиБ). Чтобы избежать переполнения при 2 ГиБ, вы можете вычислить сумму в КиБ: установите /a SUM+=%i / 1024. Также обратите внимание, что суммирование PageFileUsage (которое уже находится в КиБ) может быть более актуальным, поскольку оно не будет учитывать страницы общей памяти. много раз. - person Antosha; 25.03.2013