2024.9.16(mon)バッチファイル

敬老の日で祝日だが事務所詰め。

前々から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を入れ替えたときに、また一からやり直しになるな