Windows批处理:模拟了`timeout`命令(Windows batch: analogue

2019-06-28 06:43发布

我试图找出如何在Windows批处理文件限制程序的执行时间。 有什么样的Unix timeout命令? 请指教。

Answer 1:

要限制某个程序运行,你可以做这样的事情的时候

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

启动yourprogram.exe ,等待10秒钟,然后杀死该程序。



Answer 2:

我刚安装的Cygwin和使用UNIX风格timeout从分发命令。



Answer 3:

我不认为这是一个超时命令。 但是,您可以在后台启动和睡眠(使用ping)执行任务的超时持续时间然后杀死任务。



Answer 4:

此代码等待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 (

但选择带来了一组自己的限制表中的。 一方面,它会停止倒计时,如果这是不是中了关键的选择(在这种情况下sk )已被按下,基本锁定了,直到正确的做出选择。 其次, 空格键也不能选择。



文章来源: Windows batch: analogue for `timeout` command