なんだかふわっとしたタイトルになってしまった、、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みたいな物を利用して対応するのが便利だと思いますが、色々と制限がある環境では使えるかもしれない。
即興で作った物なので今見ると変数名とか適当すぎますね、動けば良いのよ動けば・・・
コメント