wmic进程表(在命令提示符窗口中)是否可以按值排序?

时间:2013-05-16 03:26:05

标签: sorting process cmd wmic tasklist

我一直在探索各种选项,例如/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

显然,流程列表可能会很长,所以我已将其删除。

6 个答案:

答案 0 :(得分: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不仅通过空格填充左对齐,因此零字符串首先作为工作集大小列的内容的前缀,这可能实际上从第62列开始 - 但是第61列是空间。使用“60”,因为子串设施从列0开始计数,而不是列1 然后用[无]替换每个空间,剥离尾随空间(也很方便地,从第61列开始的空间)
结果字符串中的最后20个字符构成了workingsetsize列的前导零填充版本 将$添加到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只是扩展用于排序的变量名,并使名称唯一。

答案 1 :(得分:2)

这对你有用吗?它适用于Win 8,提供按内存使用情况排序的进程列表。

tasklist /nh |sort /+65

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

我在这里使用了Peter的技术,但是以CSV格式返回了数据,这更容易解析批量文件,在“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

答案 5 :(得分:0)

如果您可以选择使用PowerShell,则应该可以进行以下操作:

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