BAT获得进程内存占用,超出限制则终止进程

该脚本用于监控dwm.exe进程的内存使用,当超过300MB时,通过taskkill命令结束该进程。脚本设置为计划任务并在后台定期检查,以降低系统资源消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作电脑 经常出现 dwm.exe占用内存过大问题,所以弄了这个脚本,放在计划任务里,空闲时执行

rem  假设进程为  dwm.exe  ,内存限制为  300MB
rem  测试环境 Win10
rem  以管理员权限运行,计划任务里,需要选中“使用最高权限运行"

@echo off

setlocal enabledelayedexpansion

:loop
for /f "tokens=1,5" %%a in ('tasklist /fi "imagename eq dwm.exe" /nh /fo table') do (
  set "memory=%%b"
echo 1: !memory!
  set "memory=!memory:,=!"
echo 2: !memory! 
  set /a "memory=memory/1024"
echo 3: !memory! 
  if !memory! gtr 300 (
    goto killed
  ) else ( 
    goto nokill
    )
)


:killed
   echo taskkill
    timeout /t 3 >nul
   echo ==== %date% %time% ====>>taskkill-dwm.txt
   echo memory=!memory! MB>>taskkill-dwm.txt
   echo will terminate.>>taskkill-dwm.txt
    taskkill /f /im dwm.exe
    goto end

:nokill 
   echo no terminated.
    goto end

:end
   echo ==== %date% %time%   END====>>taskkill-dwm.txt

@echo off setlocal enabledelayedexpansion :: 配置参数 set LOG_FILE=chrome_usage.log set INTERVAL=5 :: 间隔时间(秒) set MAX_RUN_TIME=0 :: 最大运行时间(秒),0表示限制 set CHROME_PROCESS=chrome.exe :: 检查日志文件是否存在,不存在则创建表头 if not exist "%LOG_FILE%" ( echo 时间,CPU占用率(%),内存占用率(Kb) > "%LOG_FILE%" ) echo 开始监控Chrome浏览器,每隔%INTERVAL%秒记录一次数据... echo 日志文件: %CD%\%LOG_FILE% echo 按Ctrl+C停止监控... :: 记录开始时间 set START_TIME=%time% set ELAPSED_TIME=0 :MAIN_LOOP :: 检查是否达到最大运行时间 if %MAX_RUN_TIME% GTR 0 ( set /a ELAPSED_TIME=!ELAPSED_TIME!+%INTERVAL% if !ELAPSED_TIME! GEQ %MAX_RUN_TIME% goto END_LOOP ) :: 获取当前时间 for /f "tokens=1-4 delims=:.," %%a in ("%time%") do ( set CUR_HOUR=%%a set CUR_MIN=%%b set CUR_SEC=%%c set CUR_MSEC=%%d ) set CUR_TIME=!CUR_HOUR!:!CUR_MIN!:!CUR_SEC! :: 获取Chrome进程的CPU和内存占用 set TOTAL_CPU=0 set TOTAL_MEM=0 set PROC_COUNT=0 for /f "tokens=1-5 delims= " %%p in ('wmic process where name^="%CHROME_PROCESS%" get ProcessID,PercentProcessorTime,WorkingSetSize ^| findstr /v "ProcessID"') do ( set /a TOTAL_CPU=!TOTAL_CPU!+%%q set /a TOTAL_MEM=!TOTAL_MEM!+%%r set /a PROC_COUNT=!PROC_COUNT!+1 ) :: 计算平均值 if %PROC_COUNT% GTR 0 ( set /a AVG_CPU=!TOTAL_CPU! / %PROC_COUNT% set /a AVG_MEM=!TOTAL_MEM! / %PROC_COUNT% :: 写入日志 echo !CUR_TIME!,!AVG_CPU!%,!AVG_MEM! >> "%LOG_FILE%" :: 输出到控制台 echo [!CUR_TIME!] CPU: !AVG_CPU!%, 内存: !AVG_MEM! KB ) else ( echo [!CUR_TIME!] 未找到Chrome进程 echo [!CUR_TIME!],0,0 >> "%LOG_FILE%" ) :: 等待指定间隔 timeout /t %INTERVAL% /nobreak >nul goto MAIN_LOOP :END_LOOP echo 监控已停止,总运行时间: !ELAPSED_TIME! 秒 goto END :ERROR_HANDLING echo 发生错误: %errorlevel% goto END :END endlocal
最新发布
06-18
<think>好的,我现在需要解决用户关于“bat重复打开文件”的问题。首先,用户可能是在编写批处理脚本时遇到了文件被重复打开的情况,或者希望了解如何实现重复打开文件的操作。接下来,我得明确用户的具体需求是什么。 首先,“bat重复打开文件”可能有两种情况:一种是意外重复打开导致问题,需要解决方法;另一种是用户希望编写一个批处理脚本,有意重复打开某个文件多次。我需要考虑到这两种可能性,并分别给出解释和解决方案。 接下来,我需要回忆批处理脚本的基本语法和相关命令。比如,使用`start`命令可以打开文件,而循环结构可以使用`for /l`来实现。同时,需要注意在循环中使用`start`时可能会出现的并发问题,比如同时打开多个实例导致资源冲突。 然后,用户的问题可能涉及到如何正确编写循环结构,以及如何避免重复打开时的错误。比如,是否需要延迟执行,或者是否需要检查文件是否已经打开。不过,在批处理中,检测文件是否已被打开比较复杂,通常可能需要依赖第三方工具或者更复杂的脚本,这可能超出批处理本身的能力范围。 另外,用户可能遇到的问题包括:脚本无限循环打开文件,导致系统资源耗尽;或者每次打开文件时没有正确指定程序,导致文件无法正确打开。这时候需要给出示例代码,并解释每个部分的作用,帮助用户理解如何控制打开的次数和方式。 还需要考虑用户可能的使用场景。比如,用户可能想要测试某个程序多次打开同一个文件时的行为,或者自动化某些需要重复打开文件的任务。这时候,示例脚本中的`notepad`和`example.txt`可能需要根据实际情况替换,提醒用户注意路径和程序的选择。 此外,需要提醒用户注意安全性问题,避免无意中执行恶意脚本或导致系统不稳定。比如,如果用户不小心将循环次数设置得过大,可能会快速打开大量程序实例,影响系统性能。因此,在示例中给出有限的循环次数(如5次)是合理的,并建议用户根据需求调整。 最后,总结可能出现的问题和解决方案,确保回答结构清晰,步骤明确,帮助用户逐步解决问题。同时,确保遵循系统级指令,正确使用LaTeX格式,虽然在这个问题中数学公式可能较少,但如果有变量或代码示例,需要正确使用行内或独立格式。</think>在批处理脚本(.bat)中,“重复打开文件”通常指通过循环或多次执行命令反复启动某个程序并加载文件。以下是关键点分步说明: --- ### **1. 基础场景:循环内使用`start`命令** 以下示例展示用`for /l`循环重复打开文件: ```batch @echo off for /l %%i in (1,1,5) do ( start notepad "C:\example.txt" timeout /t 1 >nul ) ``` - **代码解释**: - `for /l %%i in (1,1,5)`:循环5次(从1到5,步长1)。 - `start notepad "C:\example.txt"`:每次循环用记事本打开`C:\example.txt`。 - `timeout /t 1`:每次打开后等待1秒,避免资源冲突。 --- ### **2. 常见问题及解决** #### **问题1:文件被重复锁定** - **现象**:若文件被某个进程占用(如Excel),再次打开会报错。 - **方案**: ```batch start excel "C:\data.xlsx" timeout /t 5 >nul //等待前一个进程释放文件 ``` #### **问题2:无限循环导致系统卡死** - **错误示例**: ```batch :loop start calc.exe goto loop //无限启动计算器 ``` - **改进**:**务必添加终止条件或限制次数**。 --- ### **3. 进阶操作:检查文件存在性后再打开** ```batch @echo off set file="C:\test.txt" if exist %file% ( for /l %%i in (1,1,3) do ( start notepad %file% ) ) else ( echo 文件不存在! ) ``` --- ### **4. 注意事项** - **路径含空格**:路径需用引号包裹,如`start "C:\Program Files\app.exe"`。 - **指定程序**:若文件无默认关联程序,需明确指定,如`start photoshop.exe "image.psd"`。 - **管理员权限**:部分操作需提升权限,在脚本开头添加: ```batch fltmc >nul 2>&1 || ( echo 请求管理员权限... powershell start-process -filepath "%0" -verb runas exit ) ``` --- ### **总结** - **核心命令**:`start` + 循环控制(如`for /l`)。 - **关键逻辑**:控制打开频率、处理文件锁定、校验文件存在性。 - **风险防范**:避免无限循环,必要时添加延时(`timeout`)。 如需进一步调试,可在脚本开头添加`echo on`查看执行细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值