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

タイムアウトコマンドはないと思います。ただし、バックグラウンドでタスクの実行を開始し、タイムアウト期間中(pingを使用して)スリープしてから、タスクを強制終了することができます。

于 2012-09-12T20:04:15.747 に答える
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する必要があります。これにより、+ Ctimeoutを押して%ProgramName%を終了できますが、終了するとバッチファイルが要求します。ずさんな/乱雑な/厄介な私見。CTRLTerminate 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)が押された場合、カウントダウンが停止し、正しい選択が行われるまで基本的にロックされます。第二に、SPACEBAR選択することはできません。

于 2012-09-15T02:03:02.720 に答える