我有一个批处理脚本,它启动一个Launcher文件并等待所有子程序加载,如果“是”,则检查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
答案 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