3

我试图找出如何限制Windows 批处理文件中的程序执行时间。有类似 Unixtimeout命令的东西吗?请指教。

4

4 回答 4

4

为了限制程序必须运行的时间,你可以做这样的事情

start yourprogram.exe
timeout /t 10
taskkill /im yourprogram.exe /f

启动yourprogram.exe,等待 10 秒,然后终止程序。

于 2012-09-13T08:37:55.033 回答
2

我刚刚安装了Cygwin并使用了发行版中的 unix 风格timeout的命令。

于 2012-11-29T13:24:00.313 回答
0

此代码等待 60 秒,然后检查 %ProgramName% 是否正在运行。

要增加此时间,请更改 的值WaitForMinutes

要减少检查之间的间隔,请设置WaitForSeconds您希望它等待的秒数。

@echo off
set ProgramName=calc.exe
set EndInHours=2

:: How Many Minutes in between each check to see if %ProgramName% is Running
:: To change it to seconds, just set %WaitForSeconds% Manually
set WaitForMinutes=1
set /a WaitForSeconds=%WaitForMinutes%*60

:: How many times to loop
set /a MaxLoop=(%EndInHours%*60*60) / (%WaitForMinutes%*60)

REM Use a VBScript popup window asking to terminate %ProgramName%
echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs
echo Wscript.Quit (WshShell.Popup( "Click 'OK' to terminate %ProgramName%." ,10 ,"Terminate %ProgramName%", 0)) >> %tmp%\tmp.vbs

start %ProgramName%
set running=True
:: Give time for %ProgramName% to launch.
timeout /t 5 /nobreak > nul
setlocal enabledelayedexpansion
for /l %%x in (1,1,%MaxLoop%) do (
  if "!running!"=="True" for /l %%y in (1,1,%WaitForMinutes%) do (
    if "!running!"=="True" (
      set running=False
      REM call Pop-Up
      cscript /nologo %tmp%\tmp.vbs
      if !errorlevel!==-1 (
        for /f "skip=3" %%x in ('tasklist /fi "IMAGENAME EQ %ProgramName%"') do set running=True
      ) else (
        taskkill /im %ProgramName%
      )
    )
  )
)
if exist %tmp%\tmp.vbs del %tmp%\tmp.vbs

此代码使用 VBScript 制作弹出框。单击OK将导致 %ProgramName% 通过 被杀死taskkill


如果您不想使用弹出窗口,可以timeout通过删除...

REM Use a VBScript popup window asking to terminate %ProgramName%
echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs
echo Wscript.Quit (WshShell.Popup( "Click 'OK' to terminate %ProgramName%." ,10 ,"Terminate %ProgramName%", 0)) >> %tmp%\tmp.vbs

...并替换这个...

      REM call Pop-Up
      cscript /nologo %tmp%\tmp.vbs
      if !errorlevel!==-1 (

...有了这个:

      REM Use CTRL+C to kill %ProgramName%
      timeout /t %WaitForSeconds% /nobreak
      if !errorlevel!==0 (

使用/nobreak是必要的,因为timeout不区分按键或超时。这将允许您通过按CTRL+C 来终止 %ProgramName% ,但这会导致您的批处理文件Terminate batch job (Y/N)?在您这样做时询问。马虎/凌乱/讨厌的恕我直言。


您可以改为使用CHOICE以下代码替换上述代码:

      REM Using choice, but choice can get stuck with a wrong keystroke
      Echo [K]ill %ProgramName% or [S]imulate %WaitForSeconds% Seconds
      Choice /n /c sk /t %WaitForSeconds% /d s
      if !errorlevel!==1 (

但是选择带来了它自己的一系列限制。一方面,如果按下了不在其选择范围内的键(在本例中为sand k),它将停止倒计时,基本上锁定直到做出正确的选择。第二,SPACEBAR不能选择。

于 2012-09-15T02:03:02.720 回答
0

我认为没有超时命令。但是,您可以开始在后台执行任务并在超时时间内休眠(使用 ping),然后终止该任务。

于 2012-09-12T20:04:15.747 回答