不知道是不是通病
bug描述:
关闭Vegas后,后台有个假进程,并占用了200M左右内存空间。问题在于,再次打开Vegas时,它会另开一个进程,不会杀死原来的假死进程。如此往复开个10几次,3G内存就消耗殆尽了。
解决方案:
在桌面新建批处理bat,并将一下代码复制进去,以后用批处理代替原来的快捷方式而启动。
如果想要杀死假后台进程,再运行下批处理就行(仅杀死,需再运行一次批处理才会重新打开Vegas)
@echo off
mode con: cols=42 lines=1
tasklist /fo csv /nh /fi "IMAGENAME eq vegas170.exe" /fi "status eq running"| findstr vegas170>nul && (title 检测到Vegas已运行 & set/p=Vegas已运行,等7秒或按s跳过<nul & choice /c s /t 7 /d s>nul)
(tasklist /fo csv /nh /fi "IMAGENAME eq vegas170.exe" | findstr vegas170 >nul) && (echo; &pause) || (start vegas170 %* & exit)
(for /f tokens^=2^ delims^=^"^, %%i in ('tasklist /fo csv /nh /fi "IMAGENAME eq vegas170.exe" /fi "status eq not responding" ') do tskill %%i) && (title 已杀死伪进程 & echo; &set/p=已杀,可重开批处理来打开Vegas,按任意键<nul & pause>nul)
代码详解:
@echo off
:: 关闭回显
mode con: cols=42 lines=1
:: 设置窗口大小,宽42,行1
tasklist /fo csv /nh /fi "IMAGENAME eq vegas170.exe" /fi "status eq running"| findstr vegas170>nul && (title 检测到Vegas已运行 & set/p=Vegas已运行,等7秒或按s跳过<nul & choice /c s /t 7 /d s>nul)
:: 显示任务列表,以csv简单列表格式显示结果,并筛选后只显示:进程名(映像名)为vegas170.exe 且 状态为running。将结果传递给findstr过程,寻找"vegas170"关键字 。找到后(findstr执行成功)叫你等待7秒,等待假进程
(tasklist /fo csv /nh /fi "IMAGENAME eq vegas170.exe" | findstr vegas170 >nul) && (echo; &pause) || (start vegas170 %* & exit)
:: 如果还是能找到Vegas进程,就叫你再按下任意键,**否则就新开一个Vegas**
(for /f tokens^=2^ delims^=^"^, %%i in ('tasklist /fo csv /nh /fi "IMAGENAME eq vegas170.exe" /fi "status eq not responding" ') do tskill %%i) && (title 已杀死伪进程 & echo; &set/p=已杀,可重开批处理来打开Vegas,按任意键<nul & pause>nul)
:: for结构用来提取字符串(batch反人类设计),提取无响应(not respoding)的Vegas进程ProcessID,把提取的PID传递给tskill过程,并告诉你暗杀成功XD
注意:tskill比taskkill更为强力,taskkill /f 会提示“没有此任务的实例运行”,tskill可以(搞不懂)
运行结果:
第一次打开Vegas,批处理跳过第1行;关闭Vegas后,再运行会杀死假进程;再运行一次批处理,Vegas才会被重新启动
有趣的现象:
刚关闭Vegas,若不等待几秒,进程状态仍被识别为runnning(跟Windows判断机制有关?)