5,15,25,35,45,55分に実行するbatバッチ

直近の5が付く分までの秒数を計算できれば、timeoutコマンドで秒数を指定して待つことができる。

コマンドプロンプト、batファイルでの計算は、set /a 変数=オペランドと演算子とオペランド。

C:\Users\take>set /a x=3*2
6
C:\Users\take>set /a x=3/2
1

ここでは、演算子は*と/。

コマンドから一部をとり出すこともできる。とりあえず、timeコマンド。時間を表示し変更もできる。

C:\Users\take>time
現在の時刻: 12:19:05.42
新しい時刻を入力してください:

今の時間はecho %time%で表示できる。cmd.exeが持っているtimeはコマンドです。

C:\Users\take>echo %time%
22:19:18.21

分の部分を取り出す。set /a mm=%time:~3,2%。左から3文字目から2文字取り出す。

C:\Users\take>echo %time%
22:21:41.78
C:\Users\take>set /a mm=%time:~3,2%
21

秒を取り出す。set /a ss=%time:~6,2%

C:\Users\take>set /a ss=%time:~6,2%
56

直近の5,15,25,35,45,55を探す前に、剰余計算。

分を10で割って余りをxに入れる。%%は剰余計算の演算子。

set /a x=mm%%10

%%の剰余計算はコマンドプロンプトではできない。

C:\Users\take>set /a mm=%time:~3,2%
28
C:\Users\take>set /a x=mm%%10
オペランドがありません。

となるの。mmや10のオペランドはあるのにね。で、a.batファイルを作って実行する。

C:\Users\take>type a.bat
set /a mm=%time:~3,2%
echo %mm%
set /a x=mm%%10
echo %x%
C:\Users\take>a
C:\Users\take>set /a mm=32
C:\Users\take>echo 32
32
C:\Users\take>set /a x=mm%10
C:\Users\take>echo 2
2

xが5より小さい場合は、(4-x)*60+(60-ss)

xが5以上の場合は、(14-x)*60+(60-ss)

4と14は、秒の分を足すため。5や15ではない。

ifって面倒?でset /a は、(4-x)*60+(60-ss)のように複数のオペランドの計算ができないようなので。よって以下のように分解するか、別のbatファイルにする。これ素直にハマりますので分解かbatにします。

set /a aa=4-x
set /a aa=aa*60
set /a aa=aa+60
set /a aa=aa-ss

別のbatファイル。ok.bat。batバッチファイルにすると問題無く動く。

set /a aa=(4-x)*60+(60-ss)

以下、完成品。分解の方を使う。

set /a mm=%time:~3,2%
set /a ss=%time:~6,2%
echo %mm%:%ss%
set /a x=mm%%10
echo %x%
if %x% lss 5 (
set /a aa=4-x
set /a aa=aa*60
set /a aa=aa+60
set /a aa=aa-ss
) else (
set /a aa=14-x
set /a aa=aa*60
set /a aa=aa+60
set /a aa=aa-ss
)
echo %aa%

これを5.batとすると、以下のように使える。コマンドプロンプト上の変数はグローバル変数と考えていいです。callでbatファイルを実行して、そこの変数はそのコマンドプロンプトで使える。コマンドプロンプトを閉じるまで。

aa変数は5.batで使っている。callしたbatバッチファイル内の変数aaだけ使っている。

@echo off
call 5.bat
rem 10秒短くする
set /a aa=aa-10
timeout /t %aa%
echo 何か実行

5.batを何分何十秒待つのか表示するように変更。

@echo off
set /a mm=%time:~3,2%
set /a ss=%time:~6,2%
echo ??:%mm%:%ss%
set /a x=mm%%10
echo 比較する値 %x%

if %x% lss 5 (
set /a m=4-x
set /a aa=m*60
set /a aa=aa+60
set /a aa=aa-ss
) else (
set /a m=14-x
set /a aa=m*60
set /a aa=aa+60
set /a aa=aa-ss
)
set /a s=60-ss
echo 答えaaは%aa%
echo %m%分%s%秒後

実行のようす。

C:\Users\take>5
??:43:59
比較する値 3
答えaaは61
1分1秒後

引数を入れて、何秒か待つ処理を追加。

if “%1″==””の分岐を追加する。””と比較するので%1の第2引数が無いとif “”=””となって式が成立する。if %1==””だとif ==””となりエラーなる。

@echo off
if "%1"=="" (
@echo off
call 5.bat
rem 10秒短くする
set /a aa=aa-10
timeout /t %aa%
echo 何か実行
) else (
	timeout /t %1
)

引数あり。

C:\Users\take>a 2
2 秒待っています。続行するには何かキーを押してください …

引数なし。

C:\Users\take>a
??:29:4
比較する値 9
答えaaは356
5分56秒後
370 秒待っています。続行するには何かキーを押してください …