3

我一直在探索各种选项,例如/format标志,但似乎只能在 XML 或 HTML 输出中进行排序。我想在命令提示符下进行排序。似乎即使是TaskList也无法做到这一点(我更喜欢使用 wmic,因为它似乎执行得更快)。

要运行的命令的一个示例是wmic process get name,processid,workingsetsize. 进程似乎是按 processid 排序的,但按名称或内存使用 ( ) 排序会更有意义(至少在我的用例中workingsetsize)。

根据要求,这是一个示例 wmic 进程表输出:

Name                          ProcessId  WorkingSetSize
System Idle Process           0          20480
System                        4          765952
smss.exe                      384        393216
csrss.exe                     500        2850816
wininit.exe                   596        774144
csrss.exe                     612        6230016
winlogon.exe                  672        2023424
services.exe                  696        7192576
lsass.exe                     704        9814016
svchost.exe                   820        5287936
svchost.exe                   872        7454720
atiesrxx.exe                  936        1028096

显然,进程列表可能会变得很长,所以我把它剪掉了。

4

6 回答 6

2

这对你有用吗?它在 Win 8 中工作,以提供按内存使用情况排序的进程列表。

tasklist /nh |sort /+65
于 2013-05-17T02:50:26.987 回答
2
@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 不仅通过空格填充左对齐,因此零字符串首先作为 workingsetsize 列的内容的前缀,该列可能实际上从第 62 列开始 - 但第 61 列是一个空格。使用“60”,因为子字符串功能从第 0 列开始计数,而不是第 1 列。
然后每个空格都被 [nothing] 替换,去掉尾随空格(也方便地,从 col 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只是扩展用于排序的变量名并使名称唯一。

于 2013-05-16T04:34:52.173 回答
1

这可能适用于命令行(取决于 Windows 版本,没有任何保证!):

(for /f "delims=" %i in ('wmic process get Name^, ProcessId^, WorkingSetSize ') do @set "wss=%i" &call set "wss=%wss:~0,35%%wss:~-12%"&call echo(%wss%) | more +1 | sort /+35
于 2013-05-16T07:23:29.210 回答
1

我理解你的问题,这在 Windows 10 上对我来说很好:

wmic process list  get name, version |sort
or
wmic process list status |sort
or
wmic process list io |sort

阐述 Foxidrive 的答案,这也适用于任务列表:

tasklist /nh | sort

并且不需要 /+65(感谢 foxidrive 提供的信息)

Windows 10 上的“任务列表”也会这样做:

tasklist /nh /fo table
or
tasklist /fo list
or
tasklist /nh |sort
于 2016-08-08T13:53:44.893 回答
0

我在这里使用了 Peter 的技术,但返回的是 CSV 格式的数据,这对于在 size 列上排序的“PID、WorkingSetSize、Name”格式的批处理文件更容易解析。

@ECHO OFF
SETLOCAL
FOR /f "delims==" %%i IN ('set $ 2^>nul') DO SET "%%i="
FOR /f "skip=2 tokens=2-4 delims=," %%a IN ('cmd /c "wmic process get Name, ProcessId, WorkingSetSize /format:csv" ') DO (

  SET wss=0000000000000000000%%c
  CALL SET $%%wss:~-20%%=%%b,%%c,%%a

)

FOR /f "tokens=1*delims==" %%i IN ('set $') DO ECHO(%%j
pause
于 2013-05-16T06:20:12.117 回答
0

如果 PowerShell 是您的选择,那么以下应该可以工作:

PS C:\> Get-CimInstance -query "select * from win32_process" | Sort-Object -Property Name | Format-Table -Property Name, ProcessId, WorkingSetSize

于 2020-10-12T07:24:07.883 回答