@ECHO OFF
SETLOCAL
FOR /f "delims=" %%i IN (memcsv.csv) DO CALL :process %%i
GOTO :EOF
:process
SET memsize=%~5
SET memsize=%memsize:,=%
ECHO memsize found = %memsize%
GOTO :eof
Это должно привести ваш вывод в переменную с именем memsize
.
В качестве входных данных используется файл memcsv.csv
, но вы можете заменить mmcsv.csv
на
'tasklist /fi "imagename eq %PROCESS%" /FO csv ^| findstr Mem'
работать непосредственно на выходе FINDSTR
. Таким образом, ваша результирующая строка будет
FOR /f "delims=" %%i IN ('tasklist /fi "imagename eq %PROCESS%" /FO csv ^| findstr Mem') DO CALL :process %%i
который для простоты чтения можно было бы ввести как
FOR /f "delims=" %%i IN (
'tasklist /fi "imagename eq %PROCESS%" /FO csv ^| findstr Mem'
) DO CALL :process %%i
Обратите внимание, что разрывы строк специфичны - до и после одинарной кавычки.
Также, что одинарные кавычки ТРЕБУЮТСЯ и что перед каналом (|
) стоит знак вставки (^
), который сообщает cmd
, что канал является частью команды, которая должна быть выполнена, а не частью команды FOR
.
Изменить, чтобы добавить объяснение КАК.
Выходные данные tasklist...|findstr...
можно использовать как входные данные для for/f
, как если бы это был файл. Все, что вам нужно сделать, это окружить команду SINGLE-QUOTES
и убедиться, что перенаправители, такие как | < >
, "экранированы" символом вставки.
FOR /F «читает» «файл» построчно, присваивая (по умолчанию) первый «токен» в строке «метапеременной» (переменная управления циклом, %%i
в приведенном выше случае). Это поведение можно изменить, добавив управляющие предложения в FOR/F
. Вы можете использовать `tokens=x,y,z", например, чтобы присвоить номер токена x, номер y и номер z %%i, %%j, %%k соответственно.
TOKENS отсчитываются от 1 и имеют значение содержимого строки до (серии) разделителей. По умолчанию в качестве разделителей используются пробелы, запятые, точки с запятой и символы табуляции, поэтому строка
TOKEN_ONE TOKEN_2,TOKEN_THREE;Token_FOUR
когда увидит
for /f "tokens=1,3,4" %%i in (filecontainingaboveline) do
установит %%i
=TOKEN_ONE %%j
=TOKEN_THREE %%k
=Token_FOUR
Использование "delims=" отключает разделители, и, следовательно, ВСЯ строка назначается метапеременной.
ОТНОСИТЕЛЬНО, в приведенном выше коде вся строка назначается %%i
и доставляется подпрограмме :process
.
С точки зрения :process
ему был присвоен аргумент ** "cmd.exe", "11640", "Console", "1", "3,160 K"**, который он интерпретирует как последовательность из 5 параметров, разделенных запятыми - и запятая (или любой другой разделитель) ВНУТРИ "кавычек" - это данные, а не разделитель.
Доступ к параметру номер 5 осуществляется с помощью %5
, то есть "3,160 K"
, включая кавычки и запятую.
В переменную устанавливается значение пятого параметра — тильда (~
) означает «удалить заключающие кавычки». Следовательно, memsize
получает значение 3,160 K
Следующее SET
заменяет строку после двоеточия в назначенной переменной на строку после =
- запятые ничего не заменяют, а результат присваивает переменной memsize
.
goto :eof
означает "перейти к физическому концу файла". Это очень специфично - ДОЛЖНО присутствовать двоеточие. Достижение конца файла завершает подпрограмму или пакетный процесс.
Чтобы удалить последние 2 символа переменной, вы можете использовать
SET var=%var:0,~-2%
где var
— имя переменной.
ВИДЕТЬ
SET /?
из подсказки для документации.
Также GOTO /?
и FOR/?
для более подробной информации об этих командах...
person
Magoo
schedule
16.07.2013