0

我的目标是编写一个脚本,该脚本将监视进程内存使用情况并对其运行基于百分比的比较,以确定所述进程中是否存在内存泄漏。

我正在使用以下命令来获取进程的内存使用情况:

任务列表 /fi "图像名称 eq %PROCESS%" /FO csv | 找到str K

示例:“cmd.exe”、“11640”、“控制台”、“1”、“3,160 K”

这给了我一个 CSV 文件,最后一个单元格是内存使用情况。我有两个问题需要帮助。

问题 1)我如何删除除最后一个单元格之外的所有单元格,以便我可以将用于比较的 Kb 分配给变量。

问题2)如何去掉数字中的逗号?这使得使用逗号作为 delim 很难:/

有没有比 tasklist 更好的命令呢?我只需要程序使用的原始数字,它可以是 KB 或 MB。

我希望能够没有依赖项,但如果我必须有依赖项,我可以将它们包含在批处理中。

还有什么方法可以让 findstr 不返回整行?

谢谢你的帮助!两天来,我一直试图解决这个问题,但运气并不好。

4

1 回答 1

2
@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/?有关这些命令的更多详细信息...

于 2013-07-16T01:59:39.557 回答