指定時間に何かを実行させたい

プログラム

なんだかふわっとしたタイトルになってしまった、、1時間毎に報告メールを送る必要があって作ったVBScript。
管理者権限がないので、タスクスケジューラも使えない為指定時間が来たら終了するスクリプトを随分前に作った。

基本的にBATから呼び出す事を想定し、オプションで時間(+日付)を指定して実行する、既に指定時間が過ぎていた場合はエラーコード(9)を返す。

例えば、9時と10時にバッチを動かすようにしていた場合10時過ぎにBATを実行してしまうと9時と10時の処理がされるのを防ぐために
指定時間まで待って終了した場合は0を返すようにしている、BAT側はERRORLEVELをみて処理する感じ。

サンプルのBAT

2021/07/30の9時→13時→17時に SendMail.bat が実行される。

@echo off
REM 2重起動防止
set RC=-1
call :main 0>>"%~dpnx0"
exit /b %RC%

:main
title timer
cd /d %~dp0

cscript Timer.vbs /T:09:00:00 /D:2021/07/30
IF %ERRORLEVEL%==0 call SendMail.bat

cscript Timer.vbs /T:13:00:00
IF %ERRORLEVEL%==0 call SendMail.bat

cscript Timer.vbs /T:17:00:00
IF %ERRORLEVEL%==0 call SendMail.bat

set RC=0

Timber Script

Dim T,D,DD

Set objArgs = WScript.Arguments

If WScript.Arguments.Named.Exists("T") Then
	T=WScript.Arguments.Named("T")
End If

If WScript.Arguments.Named.Exists("D") Then
	D=WScript.Arguments.Named("D")
	If len(d)<>10 then
		WScript.Echo "YYYY/MM/DD の書式で指定してください"
		Wscript.Quit(9)
	End if
End If

If T<>"" Then	
	If D="" Then 
		DD=Left(now(),10)
	Else
		DD=D
	End If
	
	Wscript.Echo DD & " " & T
	S_Diff=DateDiff("s", now(), DD & " " & T)	'起動時の秒数を保存
	Do
		Diff=DateDiff("s", now(), DD & " " & T)	'指定時刻までの差(秒)
		'保存していた秒数と違う場合残りの秒数を表示させる(メッセージを1秒ごとに表示したい)
		If S_Diff<>DateDiff("s", now(), DD & " " & T) then
			Wscript.Echo D & " " & T & " まで残り:" & S_Diff & "秒"
			S_Diff=DateDiff("s", now(), DD & " " & T)	
		End If
		If Diff < 1 Then			'指定時刻になったらループを抜ける
			If Diff<0 Then
				Wscript.Quit(9)
			Else
				Wscript.Quit(0)
			End If
		End If
		WScript.Sleep 100			'CPU負荷軽減の為ちょっとスリープ

	Loop
Else
	Wscript.Echo "日時を指定して下さい、日付は省略可" & chr(13) & "例) cscript Timer.vbs /T:12:00:00 /D:2017/01/01"
End If

今時はJenkinsみたいな物を利用して対応するのが便利だと思いますが、色々と制限がある環境では使えるかもしれない。
即興で作った物なので今見ると変数名とか適当すぎますね、動けば良いのよ動けば・・・

コメント