Windowsバッチファイル内でプログラムの実行時間を制限する方法を見つけようとしています。Unixtimeout
コマンドのようなものはありますか?お知らせ下さい。
4 に答える
プログラムの実行時間を制限するには、次のようにします。
start yourprogram.exe
timeout /t 10
taskkill /im yourprogram.exe /f
それが始まりyourprogram.exe
、10秒間待ってから、プログラムを強制終了します。
Cygwinをインストールし、ディストリビューションのunixスタイルのtimeout
コマンドを使用しました。
タイムアウトコマンドはないと思います。ただし、バックグラウンドでタスクの実行を開始し、タイムアウト期間中(pingを使用して)スリープしてから、タスクを強制終了することができます。
このコードは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 (
しかし、選択はそれ自身の一連の制限をテーブルにもたらします。一つには、選択肢の中にないキー(この場合はs
とk
)が押された場合、カウントダウンが停止し、正しい選択が行われるまで基本的にロックされます。第二に、SPACEBAR選択することはできません。