Windowsのタスクでは、毎日定時に実行するようスケジュールを組んでいても、その時間にPCが起動していないと、見事にその日はスルーされ翌日まで飛ばされてしまう。
かといって、PC起動時とかログオン・ログオフ時に実行するようにしておくと、PCを1日に何度も起動・終了すると、その度に動いてしまう。1日1回しかしなくていい処理ではこれは困る。
色々と考えた結果、バッチだけの簡単な方法で、1日1回だけ自動で動くタスクの組み方を考えたので公開してみる。所詮覚書のメモである。
方法としては本当に簡単で、バッチを実行したら、当日の日付をファイル名として、処理済判定用の一時ファイルを作ればいいのだ。
まず%date%から「/」を抜いて%datetmp%にする処理を事前に入れておく。今日であれば「20101229」となる。
で、バッチ開始時に当日の日付のファイルが存在すればバッチ中止、無ければ処理開始とすればいい。「if exist %datetmp%.txt goto end」という具合である。
%datetmp%.txtが無ければ本処理開始し、本処理の最終行に「echo hoge>%datetmp%.txt」で処理済判定用ファイルを作る。
%datetmp%には当日の日付が入るので、当日初回実行時には当日分の%datetmp%.txtは存在せず処理は行われるが、処理中に当日分の%datetmp%.txtが作られるため、当日2回目以降は当日分の%datetmp%.txtが存在するため処理はされずに終了。日付が変わればまた動くようになる。
最後に、このバッチを、Windowsのタスクで30分~2時間おきに動かせば良い。PC起動後に時間になれば実行され、1日1回だけ本処理が動くはず。
もし昔の%datetmp%.txtが残るのがいやならば、「echo hoge>%datetmp%.txt」の前に「del /q *.txt」とか入れれて消せば良い。消すファイルが「*.txt」指定が怖いのならば、%datetmp%.txt出力専用のフォルダでも作っておけば良い。「del /q datetmp¥*.txt」「echo hoge>datetmp¥%datetmp%.txt」みたいに。
robocopyとあわせて、自動ファイルミラーリングバックアップなんかを作ると便利よ。PC起動後に1日1回NASに自動バックアップとか最高ね。自動ではなく手動用に、当日実行していようがいまいが強制実行させるバッチも作っておくと便利。
この一次ファイルの存在有無を判定にする方法は、これ以外にも幅広く応用が利く。使い方はいろいろ自分で考えてください。
もう一つWindowsバッチ処理の小技を。
Windowsでバッチを実行すると、どうしても黒い画面が出てきてしまう。タスクから実行しても、出てきてしまう。普段いきなり出てくると邪魔である。これを防ぐには、専用のツールなんかもあるようだが、簡単なのは別のWindowsユーザでバックグラウンド実行することである。
Windowsタスクでは実行ユーザを指定できるので、タスクのバックグラウンド実行専用ユーザを作り、それを指定しておくといい。場合によってはAdministratorでもいい。裏で別ユーザがタスクからバッチを定期実行していても、操作中のユーザのデスクトップには一切黒い画面は出てこない。もしちゃんと動いているか確認したい場合は、タスクマネージャからプロセス一覧で別ユーザの実行中プロセスも表示させるといい。ちゃんとcmd.exeを実行しているはずだ。
年末に少しは生産性のある投稿ができてよかった。