需要简化批处理脚本以降低内存利用率

时间:2013-09-16 07:33:56

标签: batch-file

我有一个批处理脚本,它启动一个Launcher文件并等待所有子程序加载,如果“是”,则检查Chrome浏览器是否关闭,然后关闭所有其他程序。

如果Chrome浏览器未关闭,则会一直循环直至关闭。

发现问题是它在循环中使用了find命令,从而导致大量内存使用。 (我发现很少有“查找”和“任务列表”命令在CMD.exe下运行)附加屏幕截图。enter image description here。这是基于流程资源管理器找到的 任何人都可以建议我以最简单的方式使用相同的代码,从而减少使用内存。提前谢谢。

目的 (我选择了(Chromium)版本的php-desktop用于php文件的自定义编程。当(浏览器)关闭时,所有其他PHP和Portable Chromium文件在任务列表中保持未关闭。为此我想到运行批处理程序它开始检查浏览器状态,一旦关闭,所有其他子程序都被强行关闭。)

        @echo off
        SETLOCAL

    REM Main FILE to be loded and wait for 25 Sec so that sub programs will load
        start Launcher.exe
        timeout /t 25 /nobreak > NUL

    REM Check Browser is closed if closed then goes to ITSOut if not runs untill its closed

        :MAIN
        tasklist | FIND "Chrome.exe" 2>NUL | find /I /N "Chrome.exe">NUL
        if "%ERRORLEVEL%"=="0" GOTO :MAIN
        if "%ERRORLEVEL%"=="1" GOTO :ITSout

    REM Checks browser is still open (exists) after confirming it closes sub programs 
        :ITSout
        tasklist | FIND "Chrome.exe" 2>NUL | find /I /N "Chrome.exe">NUL
        if "%ERRORLEVEL%"=="0" GOTO :MAIN

        FOR /f "tokens=2" %%i IN (
                       ' tasklist ^| find "ChromiumPortable.exe" '
            ) DO SET pid=%%i
            IF DEFINED pid (
                REM ECHO TASKKILL /pid %pid% /T
                TASKKILL /pid %pid% /F /T
            ) ELSE (GOTO :MAIN)


        tasklist | FIND "Chrome.exe" 2>NUL | find /I /N "Chrome.exe">NUL
        if "%ERRORLEVEL%"=="0" GOTO :MAIN

        REM echo "SETLOCAL top line phpdesktop.exe is here"
        FOR /f "tokens=2" %%i IN (
            ' tasklist ^| find "phpdesktop.exe" '
            ) DO SET pid=%%i
            IF DEFINED pid (
                REM ECHO TASKKILL /pid %pid% /T
                TASKKILL /pid %pid% /F /T
            ) ELSE (GOTO :MAIN)

     GOTO eof

3 个答案:

答案 0 :(得分:2)

此代码中的内容是高CPU利用率

REM Check Browser is closed if closed then goes to ITSOut if not runs untill its closed

    :MAIN
    tasklist | FIND "Chrome.exe" 2>NUL | find /I /N "Chrome.exe">NUL
    if "%ERRORLEVEL%"=="0" GOTO :MAIN
    if "%ERRORLEVEL%"=="1" GOTO :ITSout

使用它可能更好 - 超时会降低CPU使用率。

    :MAIN
    tasklist | FINDSTR /i "^Chrome.exe" >NUL 
    if "%ERRORLEVEL%"=="0" timeout 6 >nul & GOTO :MAIN
    if "%ERRORLEVEL%"=="1" GOTO :ITSout

答案 1 :(得分:0)

您使用哪种工具来识别内存问题是在FIND实用程序中?除了内存使用以外,是否正常?

我现在无法检查FIND,但我发现,以下代码不会花费太多内存:

:MAIN
tasklist | grep chrome
if "%ERRORLEVEL%"=="0" GOTO :MAIN

(这里我使用GREP而不是FIND,因为grep是更强大的工具;可能是它的解决方案)

此外,我无法理解代码中的逻辑(看起来你有无限循环,但你没有告诉我们这个问题)。

答案 2 :(得分:0)

你的程序流程(逻辑)对我没用。但我相信以下应该给出几乎相同的结果。唯一的区别是以下代码将尝试杀死所有ChromiumPortable.exe和phpdesktop.exe,而您的原始文件只会杀死每个循环。

@echo off
SETLOCAL

start Launcher.exe
timeout /t 25 /nobreak > NUL

:MAIN
for /f "skip=2" %%A in (
  'tasklist /fi "imagename eq chrome.exe"'
) do (timeout 1 /nobreak >null & goto :MAIN)

set "found="
for /f "skip=2 tokens=2" %%A in (
  'tasklist /fi "imagename eq ChromiumPortable.exe"'
) do ( set found=1 & taskkill /pid %%A /f /t )
if not defined found goto :MAIN

for /f "skip=2" %%A in (
  'tasklist /fi "imagename eq chrome.exe"'
) do goto :MAIN

set "found="
for /f "skip=2 tokens=2" %%A in (
  'tasklist /fi "imagename eq phpdesktop.exe"'
) do (set found=1 & taskkill /pid %%A /f /t)
if not defined found goto :MAIN

REM I have no idea what this is
eout 555

exit /b

但整体脚本的逻辑对我来说似乎不对。为什么要重复检查chrome.exe?如果找不到ChromiumPortable.exe或phpdesktop.exe,为什么要循环?它可能永远不会结束。

我认为以下内容更有意义:

@echo off

start Launcher.exe
timeout /t 25 /nobreak > NUL

:wait
for /f "skip=2" %%A in (
  'tasklist /fi "imagename eq chrome.exe"'
) do (timeout 1 /nobreak >null & goto :wait)

for /f "skip=2 tokens=2" %%A in (
  'tasklist /fi "imagename eq ChromiumPortable.exe"'
) do taskkill /pid %%A /f /t

for /f "skip=2 tokens=2" %%A in (
  'tasklist /fi "imagename eq phpdesktop.exe"'
) do taskkill /pid %%A /f /t

REM I have no idea what this is
eout 555

exit /b