Я пишу пакетный скрипт, который запускает несколько программ. Поскольку каждая программа заканчивает то, что она делает, она ждет, чтобы пользователь закрыл ее, перешел к следующему или был закрыт taskkill после таймаута так много секунд. Если я рассматриваю основной сценарий как MAIN, программа TASK и таймер как KILLER. MAIN запускает TASK и KILLER одновременно (примерно). TASK делает то, что он должен, и KILLER ждет 600 секунд, прежде чем убить TASK. Однако, если TASK был закрыт пользователем, он должен убить KILLER и вернуться в MAIN без участия пользователя. Однако, используя ping или таймаут, мне все равно придется ждать окончания срока действия таймера до того, как пакет будет фактически закрыт. Я бы не хотел, чтобы мой рабочий стол был завален окнами команд, которые ничего не сделают. Есть ли способ обойти это?Пакет: тайм-аут Taskkill без ожидания таймера
0
A
ответ
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
Включите тест в убийцу, если задача allready OFF 'taskkill' самого убийцы – SachaDee