業務の自動化i-Willink
手でやっていたフォルダのコピーを自動にする
担当者が手で共有サーバーへコピーしていた書類を、Windowsに元からある道具だけで自動にしました。変更の検知と5分ごとの見回りの二段構え、消さない同期、設定が無ければ止まる作り。その中身を書きます。
手でコピーする限り、上げ忘れは必ず起きます。Windows に元からある robocopy と FileSystemWatcher だけで、作業フォルダの変更を共有サーバーへ一方向に自動で追いかける仕組みを作りました。肝は機能より、壊さないための細部です。
ある会社で、免許証や車検証のような書類を、担当者がまず自分のパソコンの作業フォルダに置き、あとで共有サーバーの決まった場所へ手でコピーする流れがありました。作業は数秒です。でも忙しいと後回しになり、「サーバーに上がっているはず」の書類が実は無い、ということが起きていました。
コピーには判断が要りません。それなら端末の側で勝手に反映されるようにすれば、上げ忘れそのものが起きなくなります。この記事は、そのために作った仕組みの記録です。お客さんの名前は伏せています。
この記事の要点
- 1コピーは Windows 標準の robocopy に任せ、変更の検知は FileSystemWatcher を主にする
- 2検知は取りこぼすことがあるので、5分ごとの見回りを重ねて二段構えにする
- 3手元で消しても、共有サーバー側は消さない。同期は一方向で、削除は追いかけない
- 4環境ごとの設定は本体と分け、設定が無ければ動かずに止まる作りにする
検知と見回りの二段構え
変更をすぐ拾うのは FileSystemWatcher の通知です。ただ通知は取りこぼすことがあるので、5分ごとに全体を見回る処理を重ね、取りこぼしを後から拾います。
FileSystemWatcher は、フォルダの中で変更があったときに通知してくれる Windows の仕組みです。ただし Microsoft の公式ドキュメントは、短い時間に多くの変更があると内部の受け皿があふれ、変更を見失うことがある、と明記しています。
そこで、通知を主にしながら、5分ごとに作業フォルダ全体を見回る処理を並べて動かしました。通知が漏れても、遅くとも5分後には追いつきます。ネットワークが一瞬切れた間の変更も、復旧したときに全体を同期し直して拾います。
コピーそのものは、Windows 標準の robocopy に任せました。新しい道具を入れずに済むので、お客さんの端末の管理の負担が増えません。
壊さないための細部
作り込みの大半は、機能ではなく「安全な側に倒す」ための細部でした。消さない、連打で多重に動かない、ログを溜めすぎない、余計なファイルを運ばない、の4つです。
| 決めたこと | 理由 |
|---|---|
| 手元で消しても、共有サーバー側は消さない | 誤って消した書類まで共有サーバーから消えると、取り戻せない |
| 同じフォルダへの変更が続いたら、10秒待ってからまとめて1回コピーする | コピーが何重にも同時に動くのを防ぐ |
| ログは大きさで区切り、数世代だけ残す | 端末の容量を食いつぶさない |
| Windows や Office が作る一時ファイルは運ばない | 共有サーバーに意味のないファイルが溜まらない |
1つ目は特に大事です。robocopy には、送り先にあって送り元に無いファイルを消す設定(/MIR や /PURGE)があります。これを使うと、手元で誤って消した書類が共有サーバーからも消えます。私たちはこれを使わず、送り先は増える一方にしています。
端末を立ち上げたら自動で動き出すように、Windows のタスクスケジューラに「ログオン時に起動」として登録しました。
いちばんの落とし穴は、更新のときに設定を消すこと
本当に神経を使うのは、機能より更新の手順です。どのフォルダとどのフォルダを対応させるかの設定を本体から切り離し、本体だけを差し替えられるようにしました。
このスクリプトは、対応させるフォルダの組を9組持っています。サーバー名やユーザー名を含む、その端末でしか正しくない値です。これを本体と同じファイルに書くと、本体を新しくするたびに設定まで巻き込みます。
そこで設定を別のファイルに分け、そのファイルはリポジトリの管理から外しました。本体を新しい版に差し替えても、9組の設定には一切触れずに済みます。説明書にも「設定のファイルは絶対に上書きしない。更新の前に控えを取り、本体だけを差し替える」と書いて、手順を固定しています。
この分け方は、別の記事「お客さんごとの設定値をコードに入れない」で詳しく書いています。
設定が無ければ、動かずに止まる
設定のファイルが無いまま動き出すと、意図しない場所へファイルを撒くおそれがあります。設定が揃っていないときは、記録にエラーを書いて止まるのを正解にしました。
設定をリポジトリに置かない方針には、副作用もあります。取り出した直後は設定が無いので、そのままでは動きません。私たちはこれを不便ではなく、安全だと捉えました。
中途半端に空の設定で動き出すと、思わぬ場所へファイルを送る「誤った同期」が起こりえます。削除は追いかけない作りでも、誤って撒いたファイルを片づけるのは手間です。だから、設定が無ければ黙って止まる。これを正解にしておく方が、受け取った先の端末で事故が起きにくくなります。
小さな自動化ほど、運用の作りで差がつく
価値になったのは高度な技術ではなく、設定の分離、上書きしない手順、無ければ止まる作り、の3つでした。
robocopy も FileSystemWatcher も、Windows に元からある道具です。効いたのは、もっと地味なところでした。お客さんの端末は開発者の手元ではなく、次に触るのは半年後の自分か、引き継いだ誰かかもしれません。だから機能より、壊しにくさを先に作り込みます。
社内に「人が手でコピーしている限り抜ける流れ」が残っているなら、一度、仕組みの側で消せないか見直してみてください。
よくある質問
フォルダの自動コピーに、特別なソフトは要りますか?
この例では、Windows に元からある robocopy と FileSystemWatcher だけで作りました。新しいソフトを入れないので、端末の管理の負担が増えません。
FileSystemWatcher だけで十分ではないのですか?
Microsoft の公式ドキュメントは、短時間に多くの変更があると変更を見失うことがあると明記しています。そのため私たちは、5分ごとの見回りを重ねて、取りこぼしを拾う形にしています。
手元で消したファイルも、共有サーバーから消すべきですか?
私たちは消さない作りにしています。robocopy の /MIR や /PURGE を使うと送り先からも消えるので、誤って消した書類を取り戻せなくなります。
参考・出典
- FileSystemWatcher Class(Microsoft Learn)(受け皿があふれると変更を見失うことがある)
- robocopy(Microsoft Learn)(/MIR と /PURGE は送り先のファイルを消す)
- III. Config(The Twelve-Factor App)(設定をコードから分ける考え方)