@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
只是擴展了用於排序的變量名稱並使其名稱唯一。
把一個wmic輸出示例給你的問題。 – Endoro
@Endoro我加了一個。但是,正如我所提到的,任何人都可以運行'wmic process get name,processid,workingsetsize',看看我在說什麼。 – EpicCyndaquil
你可以在命令行上用GNUWin Project中的'sed'對它進行排序。 – Endoro