@ECHO OFF
SETLOCAL
FOR /f "delims==" %%i IN ('set $ 2^>nul') DO SET "%%i="
FOR /f "delims=" %%i IN ('wmic process get Name^, ProcessId^, WorkingSetSize ') DO (
IF DEFINED $0 (
SET wss=%%i
CALL SET wss=0000000000000000000%%wss:~60%%
CALL SET wss=%%wss: =%%
CALL SET wss=$%%wss:~-20%%
CALL SET %%wss%%=%%i
) ELSE (SET $0=%%i)
)
FOR /f "tokens=1*delims==" %%i IN ('set $') DO ECHO(%%j
这应该可以满足您的要求。
症结在于:WMIC
命令需要在字段名称之间使用逗号。这些需要在for/f
首先删除所有以“$”开头的环境变量,然后删除每一行WMIC
已处理。第一行(标题)保存在$0
然后每一行都保存在$size
这里的技巧是列表中的 SIZE 不仅通过空格填充左对齐,因此零字符串首先被添加到工作集大小列的内容前面,该列实际上可能从第 62 列开始 - 但第 61 列是一个空格。使用“60”是因为子字符串设施从第 0 列而不是第 1 列开始计数。
然后每个空格都被替换为 [nothing],去掉尾随空格(也很方便,第 61 列中的空格)
结果字符串中的最后 20 个字符形成工作集大小列的前导零填充版本。
在 tha 前面添加 $ ,并将结果变量设置为生成它的行的内容
最后列出一下内容$
变量按所需的顺序生成所需的列表。
请注意,声称WMIC
所描述的过程输出是按顺序排列的,无论有什么错误。仔细检查会发现它不是按 ProcessID 的顺序排列的 - 要么按字母顺序(因为该列也是左对齐),要么按字母顺序。
好的 - 修订版本,应该自动调整到进程名称列的宽度:
@ECHO OFF
SETLOCAL
FOR /f "delims==" %%i IN ('set $ 2^>nul') DO SET "%%i="
SET /A COUNT=0
FOR /f "delims=" %%i IN ('wmic process get Name^, ProcessId^, WorkingSetSize ') DO (
IF DEFINED $0 (
SET wss=%%i
CALL %%lopcmd%%
CALL SET wss2=%%wss2: =%%
SET /A COUNT+=1
CALL SET wss=$%%wss2:~-20%%%%COUNT%%
CALL SET %%wss%%=%%i
) ELSE (SET $0=%%i&set/a wsscol=0&CALL :findcol&SET $0=%%i)
)
FOR /f "tokens=1*delims==" %%i IN ('set $') DO ECHO(%%j
GOTO :eof
:findcol
IF "%$0:~0,1%"=="W" SET lopcmd=CALL SET wss2=0000000000000000000%%wss:~%wsscol%%%&GOTO :eof
SET $0=%$0:~1%
SET /a wsscol+=1
GOTO findcol
没有实质性的变化 - 只需通过在标头中定位“W”并建立适当的命令来设置变量以进行处理来计算所需的宽度......并且必须使用CALL %%var%%
方法...
小编辑:引入 COUNT 来区分具有相同工作集大小的行。Count
只是扩展了用于排序的变量名称,并使名称唯一。