2017-11-09 2 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にプロセス名が含まれているようにしてください。次に、変数@processnameが定義されているかどうかをチェックし、変数が定義されていない場合は、レポート行を生成し、@processnameを設定して、その変数が最後に定義されるようにします。

最初の行は、既存の@*変数をに設定するように設計されています。; 2^>nul@*変数が存在せず、キャレットは>をエスケープして>forではなく、実行するコマンドの一部であることをcmdに伝えないようにします。

[後で]

私がそれをテストしたとき、動作するように見えたが、私が発明しif defined "varname"が実際に、動作しないことが表示されます。私はその命令を、動作し、それをマークしたコードに置き換えました。

+0

はあなたが確信している、あなただけではなく、そのサイズを追加するよりも倍数を無視したいですか? – Stephan

+0

@Stephanはい、確信しています。私はプロセス名にもっと興味があり、追加されたサイズはそれほど重要ではありません。 – San852

+0

あなたの質問に投稿したデータには、番号と名前を分ける空白が表示されます。画像に投稿したデータにはコロンが表示されます。あなたのデータにコロンが表示されている場合は、tokens = 1 * "%% p"をfor/fに変更してくださいforkens = 1 * delims =: "%% p" – Magoo

関連する問題