批处理:Taskkill超时而不等待计时器

时间:2014-10-24 18:06:24

标签: batch-file cmd timeout command-prompt taskkill

我正在编写一个运行一些程序的批处理脚本。当每个程序完成它正在做的事情时,它等待用户关闭它,继续下一个,或者在超时这么多秒之后被taskkill关闭。如果我将主脚本视为MAIN,则将程序视为TASK,将计时器视为KILLER。 MAIN在(大约)同时启动TASK和KILLER。 TASK做了它应该做的事情,KILLER在杀死TASK之前等了600秒。但是,如果TASK被用户关闭,它应该杀死KILLER并在没有用户交互的情况下返回MAIN。但是,使用ping或超时,我仍然需要等待计时器在批处理实际关闭之前到期。我不希望我的桌面上堆满命令窗口,它们什么也不做。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分: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 )

超时逻辑被移动到一个子程序,该程序将等待进程结束或达到超时。

答案 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