0

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

如果 Chrome 浏览器没有关闭,它会循环直到关闭。

发现的问题是它在循环中使用 find 命令,从而导致大量内存使用。(我发现很少有在 CMD.exe 下运行的“查找”和“任务列表”命令)附上截图。在此处输入图像描述. 这是基于进程资源管理器发现的,任何人都可以建议我以最简单的方式使用相同的代码,从而使其使用更少的内存。提前致谢。

目的 (我选择了(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
4

3 回答 3

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
于 2013-09-16T10:06:07.633 回答
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
于 2013-09-16T12:24:35.207 回答
0

您使用哪个工具来识别 FIND 实用程序中的内存问题?除了内存使用,一切都正确吗?

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

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

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

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

于 2013-09-16T07:56:18.753 回答