2014-10-24 5 views
0

Я пишу пакетный скрипт, который запускает несколько программ. Поскольку каждая программа заканчивает то, что она делает, она ждет, чтобы пользователь закрыл ее, перешел к следующему или был закрыт taskkill после таймаута так много секунд. Если я рассматриваю основной сценарий как MAIN, программа TASK и таймер как KILLER. MAIN запускает TASK и KILLER одновременно (примерно). TASK делает то, что он должен, и KILLER ждет 600 секунд, прежде чем убить TASK. Однако, если TASK был закрыт пользователем, он должен убить KILLER и вернуться в MAIN без участия пользователя. Однако, используя ping или таймаут, мне все равно придется ждать окончания срока действия таймера до того, как пакет будет фактически закрыт. Я бы не хотел, чтобы мой рабочий стол был завален окнами команд, которые ничего не сделают. Есть ли способ обойти это?Пакет: тайм-аут Taskkill без ожидания таймера

+0

Включите тест в убийцу, если задача allready OFF 'taskkill' самого убийцы – SachaDee

ответ

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) 

Логика тайм-аут перемещается в подпрограмму, которая будет ждать, пока процесс не завершится или тайм-аут будет достигнут.

0

Вот сценарий vbs.

Ожидается, что программа выйдет, посмотрите, есть ли она в блокноте, а затем перезагрузит блокнот, если он есть. Измените Win32_ProcessStopTrace на Win32_ProcessStartTrace для запуска программы, или Win32_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