misc.log

日常茶飯事とお仕事と

バッチファイルで、下位処理が作るファイルの生成を待ちたい

まさか2022年にもなってこんな感じでバッチファイルとかが大活躍してるとは20年前には思いませんでしたね。

事の経緯

Windows 10で動かすバッチファイルで、とある処理をいくつか順次実行させます。しかし、そのうちの1処理が「バッチ側には終わったという返事を返しているが、実はまだ動いている」という、非同期で動作してしまうものだったため、

  • 対象処理はまだ動いている
  • バッチの順次処理も並行して動いてしまう

という状況が生まれてしまいました。これはちょっと都合が悪い。

解決策

たまたま、対象となる下位処理が「終わったらデスクトップにショートカットを作る」というものだったことから、バッチからショートカットファイルの生成を監視し、ファイルが出来たら次に進むという処理を組み込むことで無事解決しました。

参考にさせてもらったのはこちらのサイト。

nashiza-blog.com

FOR文と、IF文でファイルの生成を確認しつつループ。ループの間にはtimeout命令でウェイトを挟み、ループ回数かファイル生成かどちらかで処理を抜けるというもの。記載されていたスクリプトはちょっとこちらの用途には不要なものが入っていたので、少しスッキリさせたのがこちら。

set TIME_OUT=120
for /l %%i in (1,1,%TIME_OUT%) do (
  if exist %UserProfile%\desktop\"target shotcut.lnk" (
    goto END
  )
  timeout /t 1 > nul
)

rem タイムアウト時の処理があればここに書く

:END
rem 処理終了

タイムアウトは120秒としています。

ショートカットの実ファイルは、拡張子「.lnk」。さらに空白などが入るならばダブルコーテーションで囲めばOKです。デスクトップはユーザーごとのフォルダーにあるので、特定のユーザー名をスクリプトに入れたくなければ「%UserPofile%」変数を使えば、「C:\Users\(UserName)」の部分に適宜置き換えてくれます。

参考まで。