2013-05-16 43 views
3

我一直在探索各種選項,例如/format標誌,但是看起來只能在XML或HTML輸出中進行排序。我想在命令提示符本身進行排序。看來,即使TaskList不能做到這一點(我寧願使用WMIC,因爲它似乎執行得更快)。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 

顯然,過程列表可能會很長,所以我把它割下那裏。

+0

把一個wmic輸出示例給你的問題。 – Endoro

+0

@Endoro我加了一個。但是,正如我所提到的,任何人都可以運行'wmic process get name,processid,workingsetsize',看看我在說什麼。 – EpicCyndaquil

+0

你可以在命令行上用GNUWin Project中的'sed'對它進行排序。 – Endoro

回答

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列的workingsetsize列的內容 - 但第61列是空格。使用「60」,因爲子字符串設施從第0列而不是第1列開始計數。
然後,每個空間被替換爲[無],剝離尾隨空格(也方便地,來自第61列的空間)
最後20個來自結果字符串的字符形成工作集大小列的前導零填充版本。
前置一個$到THA,並將所得變量設置爲生成它

最後行的內容,列出$變量的內容中產生所要求的順序所需要的列表。

請注意,所描述的處理輸出的聲明是無論什麼錯誤。更仔細的檢查會發現它不是按照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只是擴展了用於排序的變量名稱並使其名稱唯一。

+0

在我的Win 8 32位機器上打印一個標題行,就這些了。如果我添加一個'echo %% i',它會打印這些值,所以操作代碼無法正確運行。 – foxidrive

+0

我相信一些代碼丟失了,因爲最後一個'ECHO('語句沒有關閉')'。這將解釋爲什麼@ foxidrive無法使其工作。當你更新你的代碼時讓我知道。 – EpicCyndaquil

+0

@EpicCyndaquil - 並非如此。 'Echo('是被發現有效的多種'Echo'形式之一 - 例如'Echo(%emptyvariable%'產生一個空行,而'Echo%emptyvariable%'或'Echo。%emptyvariable%'生成ECHO狀態報告(ECHO開啓/關閉) – Magoo

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 
+0

沒有冒犯,但是輸出相當醜陋。你確實對數據進行了排序,所以非常感謝。 – EpicCyndaquil

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 
+0

在Win 8中,至少排序的數據沒有用前導零填充,因此不能按大小正確排序。 – foxidrive

+0

@foxidrive - 空格也足夠了。在這裏的例子中,我只使用空格,而不是前導零。 – Endoro

+0

我不知道你在看什麼,@Endoro,但輸出沒有按Win 8中的文件大小排序。它沒有填充空格。我忘了提到Wmic命令也返回了一個錯誤。 – foxidrive

1

這是任何使用嗎?它在Win 8中工作以提供按內存使用排序的進程列表。

tasklist /nh |sort /+65 
+0

非常有趣!它可以遠程運行的事實也很好(也是必要的)。不過,我希望它也能顯示CPU使用率,也許還有頭文件。 – EpicCyndaquil

+1

拿出/ nh,你會有一個頁眉的頁眉。 :)恐怕沒有CPU使用率。 – foxidrive

+0

這個頁腳有點有趣。有什麼方法可以在它上面添加一行'=',以便它看起來更平坦? – EpicCyndaquil

0

我明白你的問題,這工作得很好,我在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」會執行這也是:

tasklist /nh /fo table 
or 
tasklist /fo list 
or 
tasklist /nh |sort 
相關問題