敬老の日で祝日だが事務所詰め。
前々からbat(バッチ)ファイルの存在は知ってはいたもののDOS時代の古い産物だと思ってて使ってなかった。(←認識不足)
batでできることを調べてたら、Windowsのタスクスケジューラーと組み合わせることで深夜帯にバックアップやらアプリケーションの起動などができるようで、まさに自分がやりたいことができる。
早速、GoogleとChatGPTに聞きまくってバッチファイルを作ってみた。
今のところ、やりたいことは2つ。更新作業とバックアップ。
一つは、自作のDelphiアプリを立ち上げて、Updateボタンを押して1日の仕入データを商品原価に反映すること。
二つ目は、UbuntuサーバーのFirebirdのバックアップファイルをNasに飛ばすこと。
どちらも深夜帯にやらせたい作業。
更新作業
batファイルで自作アプリを起動させて、AutoHotKeyスクリプトを実行させ、更新処理を行う方法。
AutoHotKeyは、立ち上がってるアプリ名を検索して、ウインドウをアクティブにしてTabキーを使ってボタンにフォーカスしてEnterキーを押すというスクリプト。アプリを起動してTab2回押して、UpdateボタンにフォーカスさせてEnterを押すというもの。
AHKスクリプトはbatファイルから呼び出すことができる。
AutoHotkeyのインストールが必要なので、インストールする場合はAutoHotkeyの公式サイトから。
@echo off
rem プログラムを起動する
start "" "\\192.168.1.×××\app\Update_○○〇.exe"
rem AHKスクリプトを実行する
start "" "C:\Temp\update_click_button.ahk"
rem 10分待機する(600秒)
timeout /t 600
rem プログラムを終了させる
taskkill /IM "Update_〇〇〇.exe" /F
上はバッチファイルの内容。非常にシンプル。プログラムを起動してAHKスクリプトを動かして更新開始。アプリ起動してから10分後にアプリを閉じるような内容。ちなみに実際の更新時間は約6分かかる。保険のために少し長め。
そして、AHKスクリプトの内容はこれ。
; ウィンドウ名を取得して、そのウィンドウをアクティブにする
WinActivate, Update_〇〇〇
WinWaitActive, Update_〇〇〇, , 5
if !WinActive("Update_〇〇〇") {
MsgBox, Update_〇〇〇 ウィンドウが見つかりません。
ExitApp
}
sleep, 3000
;Send, {Tab}
;sleep, 1000
;Send, {Tab}
;sleep, 1000
Send, {Enter}
自作アプリが立ち上がった後にデータを引っ張ってきて処理をさせてるので、あえて時間を取ってTabを押してる。Sleep 3000は3000㎜秒となるので3秒のこと。このアプリの場合Tabキーを2回押して、Updateボタンに行き着く仕様になってる。Tab移動の間もあえて1秒の時間を作ってる。(間隔の時間は作らなくてもいいと思うけど、テストでtabが動いてるのを確認したくて)
バッチファイルをダブルクリックして起動させると問題なく動く。
が、ここからが問題で、タスクスケジューラーに登録して、Windowsロックをかけて動かしてみたところ、「Update_〇〇〇 ウィンドウが見つかりません。」と表示され更新処理がされてなかった。ここからはタスクスケジューラーの設定の問題となるため割愛するけど、あまり時間もなかったためAHKを使った処理を諦めて、最終的に行った内容は、
- 自作アプリを修正し、タイマーで23:30に更新処理開始のソースコードを書く
- 23:28にタスクスケジューラーでにbatスクリプトを実行させる(起動)
- 23:30に更新処理開始
- 23:38にアプリを終了させる
タスクスケジューラーの設定でも結構、足止め食らっててAHKスクリプトを断念してしまったけど、今後自作アプリで使えるかもしれないと思ってる。今のところ上の対応で動いているから、これはこのまま採用とする。
バックアップ処理
これは結構使われてそうな処理だと思う。今まで、UtuntuサーバーからCrontabを使って、指定した時間にNasにデータを飛ばそうとしてたけど、Linuxに慣れてないせいか意外に面倒だったので、サーバー内にバックアップを取って終わりにしてた。これだと、物理的にサーバーのSSDが動かなくなった時に心配なので、今回はbatファイルでNasにバックアップ取るようにした。
@echo off
copy \\192.168.1.×××\db\backup\abc1.gbk \\192.168.1.△△△\bk_db\abc1.gbk
copy \\192.168.1.×××\db\backup\abc2.gbk \\192.168.1.△△△\bk_db\abc2.gbk
copy \\192.168.1.×××\db\backup\abc3.gbk \\192.168.1.△△△\bk_db\abc3.gbk
サーバーからNasへコピーするだけ。これもタスクスケジュールに登録してる。
今は、テストもかねてCドライブにTempというフォルダを作って動かしてるけど、これも別の場所に移動させないと、このPCを入れ替えたときに、また一からやり直しになるな