[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 【已解决】tasklist 如何关闭最小的explorer.exe

本帖最后由 xp3000 于 2021-4-22 23:08 编辑

假如系统一直弹explorer.exe多个,以大小顺序排列,设定允许几个运行,范围外最小的几个监控到立刻关闭

我用的WIN10系统,打开了多个文件管理器,explorer.exe进程也只有一个。
另外结束进程用的是taskkill,而不是tasklist

TOP

进程explorer.exe如果有多个的话,用以下代码
根据需求自己修改变量pmax和per的值
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::要检测的进程名
  4. set pro=explorer.exe
  5. ::最多允许多少个进程同时运行
  6. set pmax=100
  7. ::检测周期,单位秒,默认一分钟
  8. set per=60
  9. :jiance
  10. set/a cnt=0
  11. echo;正在检测%pro%...
  12. ::mid数组存放进程的pid,mem数组存放进程占用的内存
  13. for /f "tokens=1-5" %%a in ('tasklist^|find /i "%pro%"') do (
  14. set/a cnt+=1
  15. set mid!cnt!=%%b
  16. set mem=%%e
  17. set mem=!mem:,=!
  18. set mem!cnt!=!mem!
  19. )
  20. :shengxu 升序排列,占用内存最小的几个就在前面。
  21. set/a px=0
  22. for /l %%a in (1,1,%cnt%) do (
  23.     if %%a neq %cnt% (
  24.         set/a q=%%a+1
  25.         for /f %%b in ("!q!") do (
  26.             set/a q1=!mem%%a!,q2=!mem%%b!,q3=!mid%%a!
  27.             if !q1! gtr !q2! (
  28.                 set/a px+=1,t=q1,mid%%a=!mid%%b!
  29.                 set/a mem%%a=q2,mem%%b=t,mid%%b=q3
  30.             )
  31.         )
  32.     )
  33. )
  34. if %px% neq 0 (goto shengxu)
  35. ::去除超过pmax的进程
  36. if %cnt% gtr %pmax% (
  37.     set/a q=cnt-pmax
  38.     for /l %%a in (1,1,!q!) do (
  39.         taskkill /f /fi "PID eq !mid%%a!" /im %pro%
  40.     )
  41. )
  42. echo;休息中...
  43. for /f "delims==" %%a in ('set m') do (set "%%a=")
  44. ping/n %per% 127.0>nul
  45. goto jiance
复制代码
1

评分人数

TOP

本帖最后由 xp3000 于 2021-4-22 17:42 编辑

谢谢解答,但是代码不能关闭explorer,还会产生大量cmd.exe和find
  1. @echo off&setlocal enabledelayedexpansion
  2. set f=explorer.exe
  3. for /f "tokens=1,2,5,6* delims=, " %%a in ('tasklist /fo csv^|findstr /i /c:"!f!"') do (
  4. set PID=%%b&set size=%%c%%d&set size=!size:^"=!&set str=!f! PID=!PID:~1,-1! 大小 !size!
  5. (set n=sort /+1 !size!
  6. for /f "tokens=1,2,3,4,5 delims== " %%i in ('echo !str!^|findstr /r "!n!" ') do (
  7.     echo %%i 大小=%%m PID=%%k
  8. ))
  9. )
  10. pause
复制代码
得到结果是,无法大小排序
explorer.exe 大小=106224 PID=1628
explorer.exe 大小=20608 PID=7976
explorer.exe 大小=20560 PID=2528
explorer.exe 大小=20596 PID=9300
explorer.exe 大小=20640 PID=8224
explorer.exe 大小=20664 PID=16676
explorer.exe 大小=20680 PID=12544
explorer.exe 大小=20908 PID=9388
explorer.exe 大小=20764 PID=6484
explorer.exe 大小=20864 PID=7820
explorer.exe 大小=20920 PID=14460
explorer.exe 大小=21028 PID=7448
explorer.exe 大小=21056 PID=9644
explorer.exe 大小=20892 PID=14572
explorer.exe 大小=21016 PID=5572
explorer.exe 大小=21036 PID=8388
explorer.exe 大小=21008 PID=8940
explorer.exe 大小=20976 PID=14844
explorer.exe 大小=21228 PID=10316
explorer.exe 大小=21044 PID=10636

TOP

应该是读取进程PID和大小时出的问题
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-5" %%a in ('tasklist^|find /i "explorer.exe"') do (
  3.     echo;explorer.exe 大小=%%e PID=%%b
  4. )
  5. pause
  6. exit
复制代码
你试试上面的代码,看能否得到explorer.exe正确的PID和大小。不能就是读取的问题。

TOP

回复 4# xp3000
sort是按字符大小排序,并不是数值大小排序。
9和82用sort排序的话得到的是9,82。

在你得到的explorer.exe大小里有的是5位数,有的是6位数,需全部统一成6位数,只需在5位数的前面加个0即可
并且还要sort /+合适的n 才能得到正确的排序结果。

TOP

谢谢了,
很奇怪,第一论无效N次,关闭电脑打开又能用了

TOP

返回列表