0

いくつかのプログラムを実行するバッチ スクリプトを作成しています。各プログラムが処理を終了すると、ユーザーがそのプログラムを閉じるか、次のプログラムに進むか、数秒のタイムアウト後に taskkill によって閉じられるのを待ちます。メインスクリプトをMAIN、プログラムをTASK、タイマーをKILLERと考えれば。MAIN は TASK と KILLER を (ほぼ) 同時に開始します。TASK は本来の処理を実行し、KILLER は 600 秒待ってから TASK を強制終了します。ただし、TASK がユーザーによって閉じられた場合は、KILLER を強制終了し、ユーザーの操作なしで MAIN に戻る必要があります。ただし、pingまたはタイムアウトを使用すると、バッチが実際に閉じる前に、タイマーが期限切れになるまで待つ必要があります。何もしないコマンド ウィンドウでデスクトップを散らかしたくありません。これを回避する方法はありますか?

4

2 に答える 2

0

このようなものを使用できます

@echo off
    setlocal enableextensions disabledelayedexpansion

    start "" task.exe
    call :timeoutProcess "task.exe" 300

    start "" task.exe 
    call :timeoutProcess "task.exe" 300

    exit /b

:timeoutProcess process timeout [leave]
    rem process = name of process to monitor
    rem timeout = timeout in seconds to wait for process to end
    rem leave   = 1 if process should not be killed on timeout
    for /l %%t in (1 1 %~2) do (
        timeout /t 1 >nul
        tasklist | find /i "%~1" >nul || exit /b 0
    )
    if not "%~3"=="1" taskkill /f /im "%~1" >nul 2>nul
    if %errorlevel% equ 128 ( exit /b 0 ) else ( exit /b 1 )

タイムアウト ロジックは、プロセスが終了するかタイムアウトに達するまで待機するサブルーチンに移動されます。

于 2014-10-24T18:57:53.783 に答える
0

これが vbs スクリプトです。

プログラムが終了するまで待機し、メモ帳であるかどうかを確認し、メモ帳である場合は再起動します。プログラムの開始、またはすべての開始と停止の場合は に変更Win32_ProcessStopTraceします。Win32_ProcessStartTraceWin32_ProcessTrace

コンソール スクリプトはこのように開始されます。GUI スクリプトは、スクリプトを直接実行するだけです。GUI スクリプトは非表示です。

cscript "c:\somefolder\script.vbs"

スクリプトで待機するにはwscript.sleep 600000(ミリ秒)。

Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessStopTrace")

Do
    Set objReceivedEvent = objEvents.NextEvent
    wscript.echo objReceivedEvent.ProcessName
    If lcase(objReceivedEvent.ProcessName) = lcase("Notepad.exe") then 
        WScript.echo "Process exited with exit code " & objReceivedEvent.ExitStatus
        WshShell.Run "c:\Windows\notepad.exe", 1, false
    End If
Loop

これは、非表示のコマンド ウィンドウを起動する方法です。

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "cmd /k dir c:\windows\*.*", 0, false
于 2014-10-24T19:45:04.677 に答える