0

Launcherファイルを開始し、すべてのサブプログラムがロードされるのを待ち、「はい」の場合はChromeブラウザが閉じられていることを確認し、プロセスから他のすべてのプログラムを閉じるバッチスクリプトがあります。

Chrome ブラウザが閉じられていない場合は、閉じるまでループします。

発見された問題は、ループ内で find コマンドを使用したため、多くのメモリが使用されたことです。(CMD.exe の下で実行されている "Find" および "Tasklist" コマンドはほとんど見つかりませんでした) 添付のスクリーンショット。ここに画像の説明を入力. これはプロセスエクスプローラーに基づいて発見されました。同じコードを最も簡単な方法で使用して、メモリの使用量を減らすことを提案してください。前もって感謝します。

目的 (私は、php ファイルのカスタム プログラミング用に (Chromium) バージョンの php-desktop を選択しました。(Browser) が閉じているとき、他のすべての 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

0

あなたのプログラム フロー (ロジック) は私には意味がありません。しかし、以下はほぼ同じ結果になるはずです。唯一の違いは、次のコードはすべての ChromiumPortable.exe と phpdesktop.exe を強制終了しようとするのに対し、元のコードはループごとに 1 つだけ強制終了することです。

@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 に答える