2017-11-09 13 views
1

상위 10 개의 메모리를 소비하는 프로세스를 얻으려고하고 있는데이 코드에서 대답으로 제공된 Question 코드를 사용하고 있습니다. 그것은 다른 메모리 크기를 소모하는 프로세스의 여러 항목을 원하지 않는다는 점을 제외하고는 잘 작동하며 메모리 소비량이 다르기 때문에 정렬 할 수 없습니다. 코드는 다음과 같습니다 대신 기존 코드의 출력동일한 프로세스 이름을 가진 항목을 제거하는 방법이 있습니까?

96931840:iexplore.exe 
82161664:explorer.exe 
42319872:svchost.exe 
31469568:dwm.exe 
25690112:SearchIndexer.exe 
17002496:taskhostex.exe 
11007590:VCExpress.exe 
8033894:avp.exe 
7190528 :Skype.exe 
7000416 :SkypeBrowserHost.exe 

:

@echo off 
setlocal EnableDelayedExpansion 

(for /F "skip=1 tokens=1,2" %%a in ('wmic process get name^,workingsetsize') do (
set "size=   %%b" 
echo !size:~-10!:%%a 
)) > wmicc.txt 
set i=0 
for /F "skip=1 delims=" %%a in ('sort /R wmicc.txt') do (
echo %%a 
set /A i+=1 
if !i! equ 25 goto :end 
) 
:end 

내가 같은 출력을 얻을 수

96931840:iexplore.exe 
82161664:explorer.exe 
42319872:svchost.exe 
33656832:svchost.exe 
31469568:dwm.exe 
26943488:iexplore.exe 
25690112:SearchIndexer.exe 
18550784:svchost.exe 
17002496:taskhostex.exe 
16343040:svchost.exe 

답변

1
@echo off 
setlocal EnableDelayedExpansion 

set num=25 

set /A skip=-num 
for /F "skip=1 tokens=1,2" %%a in ('wmic process get name^,workingsetsize') do (
    set "size=   %%b" 
    set "size=!size:~-10!" 
    if not defined proc[%%a] (
     set "proc[%%a]=!size!" 
     set "size[!size!:%%a]=1" 
     set /A skip+=1 
    ) else if %%b gtr !proc[%%a]! (
     set "size[!proc[%%a]!:%%a]=" 
     set "proc[%%a]=!size!" 
     set "size[!size!:%%a]=1" 
    ) 
) 

if %skip% lss 1 (set "skip=") else set "skip=skip=%skip%" 
for /F "%skip% tokens=2 delims=[]" %%a in ('set size[') do echo %%a 

출력 예 : San852 @

5517312:NisSrv.exe 
    5537792:HD-LogRotatorService.exe 
    5939200:spoolsv.exe 
    6062080:WUDFHost.exe 
    6168576:igfxpers.exe 
    6279168:conhost.exe 
    6369280:wmpnetwk.exe 
    6533120:hkcmd.exe 
    6692864:igfxtray.exe 
    8073216:notepad.exe 
    8077312:WMIC.exe 
    8105984:taskhost.exe 
    9306112:lsass.exe 
    11157504:winlogon.exe 
    11767808:taskhostex.exe 
    13402112:SkyDrive.exe 
    16629760:TabTip.exe 
    17121280:SearchIndexer.exe 
    26120192:HD-Agent.exe 
    32325632:csrss.exe 
    36429824:svchost.exe 
    43114496:dwm.exe 
101998592:explorer.exe 
110260224:MsMpEng.exe 
114425856:chrome.exe 
0
@echo off 
setlocal EnableDelayedExpansion 

for /f "delims==" %%a in ('set @ 2^>nul') do set "%%a=" 

(for /F "skip=1 tokens=1,2" %%a in ('wmic process get name^,workingsetsize') do (
set "size=   %%b" 
echo !size:~-10!:%%a 
)) > wmicc.txt 
set i=0 
for /F "skip=1 delims=" %%a in ('sort /R wmicc.txt') do (
for /f "tokens=1*" %%p in ("%%a") do (
    rem the following line doesn't work 
    rem if not defined "@%%q" 
    rem the preceding line doesn't work 
    SET "flag=" 
    FOR /f "tokens=1*delims==" %%v IN ('set @%%q 2^>nul') DO IF /i "%%v"=="@%%q" SET "flag=Y" 
    IF NOT DEFINED flag (
    set "@%%q=Y" 
    echo %%a 
    set /A i+=1 
    if !i! equ 25 goto :end 
) 
) 
) 
:end 

이 전체 라인 등을 tokenises %%p,q로 읽어 들여서 %%q에 process-name이 들어 있습니다. 그런 다음 변수 @processname이 정의되어 있는지 여부를 확인하고 그렇지 않은 경우 보고서 라인을 생성하고 @processname을 설정하여 첫 번째 언급이 이제 해당 변수가 마지막으로 정의되도록합니다.

첫 번째 줄은 기존의 @* 변수를 으로 설정하도록 설계되었습니다.; 2^>nul@* 변수가없고 해당 문자가 >을 벗어나 >for이 아닌 이 실행될 명령임을 알리도록 cmd을 알리면 오류 메시지가 표시되지 않습니다.

는 [이후]

내가 그것을 테스트 할 때 작업을 나타하지만 내가 발명 한 if defined "varname" 실제로 작동하지 않는 것 같습니다. 나는 그 명령을 작동하고 그것을 표시 한 코드로 대체했다.

+0

당신에게 확신합니다, 당신은 단지 크기를 추가하는 대신 배수를 무시하고 싶어? – Stephan

+0

@Stephan 예, 물론입니다. 나는 프로세스 이름에 더 관심이 있고 추가 된 크기는 나를 위해 너무 중요하지 않다. – San852

+0

질문에 게시 한 데이터에는 숫자와 이름을 구분하는 공백이 표시됩니다. 이미지에 게시 한 데이터에는 콜론이 표시됩니다. 표시된대로 데이터에 콜론이 있으면 tokens = 1 * "%% p"를 for/f로 변경하십시오. tokens = 1 * delims = : "%% p" – Magoo