@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
命令的一部分
编辑以添加对 HOW 的解释。
的输出tasklist...|findstr...
可以用作 a 的输入,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
并传递给 subroutine :process
。
从:process
的角度来看,它被赋予了参数 ** "cmd.exe","11640","Console","1","3,160 K"**它解释为 5 个参数的序列用逗号分隔 - “引号”内的逗号(或任何其他分隔符)是数据,而不是分隔符。
参数号 5 由%5
- 访问,即"3,160 K"
- 包括引号和逗号。
该变量设置为第五个参数的值 - 波浪号 ( ~
) 表示“删除封闭引号”。因此memsize
获得值3,160 K
The nextSET
将指定变量中冒号后面的字符串替换为=
- 替换逗号后面的字符串,并将结果分配给memsize
变量。
这goto :eof
它非常具体 - 必须存在冒号。到达文件结尾会终止子程序或批处理。
要删除变量的最后 2 个字符,您可以使用
SET var=%var:0,~-2%
在哪里var
变量名
看
SET /?
从文档提示中。
此外GOTO /?
,FOR/?
有关这些命令的更多详细信息...