未経験プログラマーの雑記

元個別指導塾運営者、現プログラマーによるブログです。教育や自身の学びについて発信していきます。

プログラミングを活かして業務の一部を自動化するに至った流れ

終わってみればものすごく些細な自動化でしたが、実現するまでにいろいろと試行錯誤したので、
「こういう風に考えてプログラミングを活用している人もいるんだな」
程度に参考にしていただければと思います。
※どのような経緯で実現出来たかを書くので、どのようなコードを書いたかなどは書きません。
 
「こうすればこれが出来ます」みたいな、
「最初から答えがわかってるような書き方」
をされている記事が多いように思うんですが、実際にはいろいろ試行錯誤してると思うんですね。
でもその試行錯誤部分ってあまり書かれない気がするので、試しに書いてみます。その分長ったらしくなりますが。
 
今回自動化した作業
・決まった場所にある、決まった文言が書かれているファイルの一部を、決まった文言に書き換える(書き換えるファイルは2つ)
 
条件
・ファイルはセキュリティが設定されており、上書きするにはファイルのプロパティから上書き可能なように設定を変更する必要がある(管理者は読み取り、上書き可能)
・ファイルの場所自体は同じだが、頻繁にフォルダごと入れ替えており、その都度ファイルを書き換える必要がある
 
書き換える内容自体はそこまで多くないものの、
1.ファイルが入っているディレクトリに移動し、
2.2つのファイルそれぞれのプロパティからセキュリティについての設定を変更し、
3.それぞれのファイルを開いて書き換える
 
…これを何度もやるの、案外面倒です。(こういうのを面倒だと思うところから、自動化の工夫が始まります。知らんけど)
 
というわけで、自動化する方法を考えました。
 
最初の壁…ファイルのプロパティの変更方法
 
…最初というか、これだけが今回のネックでした。ファイルを読んで必要箇所を置換して上書きする処理なら、VBAでもPythonでもやったことがあったので。
ただ、ファイルのプロパティを変更しなければいけない…。
色々調べた結果、コマンドプロンプトでファイルのプロパティを取得出来そうな様子だったものの、プロパティを変更する方法がいまいち理解出来ず断念。
 
というわけで、ファイルのプロパティをいじるのではなく、「操作する側の権限をいじれないか」と考え始めました。
そして「エディタを管理者権限で実行すれば、ファイルのプロパティをいじらなくても編集して上書き出来るのでは?」と考えました。
 
エディタはサクラエディタを使っていたのですが、普段はもちろん普通に実行しているので、管理者として実行していません。
試しに管理者として実行し、編集すべきファイルを開いてみると、あっさり編集、上書きすることが出来ました。
ただ、管理者として実行するために、
1.毎回サクラエディタを右クリックして管理者として実行
2.その後編集すべきファイルをサクラエディタから開く
3.しかも一度でもサクラエディタを普通に開いていると、サクラエディタを普通に閉じてもタスクマネージャーからタスクを終了させないと管理者として実行出来ない
 
という、またもや面倒な自体に。
これらを解決するために、「サクラエディタを開くときは毎回管理者として実行する」よう設定。
こうすることで、サクラエディタで開くように設定したファイルをダブルクリックするだけで、(毎回管理者として開くことに関して確認のウィンドウが開くものの)スムーズにファイルを開き、編集出来る状態に。
 
正直ファイルのプロパティをいじる手間が無くなったので、ここで終わっても割と満足でしたが、
「ファイルをわざわざ2つ開いて、それぞれ『管理者として開くか』を聞かれるのがめんどくさい」
と思い、さらなる効率化、自動化を考えました。
 
とりあえず、「わざわざ2つのファイルを開く」ことを効率化すべく、ファイルのパスをPowerShellで指定してファイルを実行する方法を思いつき、実行。
連続で2回「管理者として開くか」を尋ねられるものの、フォルダからわざわざファイルを探す手間もなく、即座に指定のファイルを2つ開くことに成功しました。
そのスクリプトを保存し、ショートカットファイルを作成して、ショートカットをダブルクリックすることで実行出来るようにしたところ、かなりスムーズにファイルを開けるようになりました。
 
これで9割方満足していたものの、
「ファイルを手で修正するのがめんどくさい」
「そもそもサクラエディタでファイルを開く必要はあるのか」
という思考になりました。ここまできたら、どこまでも楽をしたい。
 
ここで、「そもそもサクラエディタでファイルを開く必要はあるのか」ということが妙に引っかかり、ちょっと考えました。
「なんでサクラエディタでわざわざ開いてたんだっけ?・・・・・・・あ、プロパティで上書き禁止にされてたから・・・いや、管理者として実行したら上書き出来るようになったし・・・それPowerShellでも出来るんじゃね?」
ということで、「サクラエディタを管理者として実行し、2つのファイルを手入力で編集する」ではなく「PowerShellを管理者として実行し、2つのファイルを自動で修正し、上書き保存する」方向で考え始めました。
 
試しにPowerShellで普通に該当ファイルを修正、上書き保存するスクリプトを作り、実行したところ、もちろん「アクセスを拒否されました」という理由でダメ。
しかし、PowerShell自体を管理者として開き、再度スクリプトを実行したところ、あっさり完了。
ただ、修正後のファイルを開いてみたところ、SJISだったはずの文字コードがUTF16になっていたので、それを改善するためにスクリプトを少し修正しました。
 
次に、スクリプトファイルそのものに書いている、2つのファイルが入っているディレクトリのパスを、
別のテキストファイルから読み取るように変更しました。このスクリプトを他のメンバーと共有したとき、もし該当ファイルの保存先が違っていても、プログラム自体を触らなくて済むようにするためです。
 
これもあっさり完了し、完成したスクリプトをショートカットからダブルクリックで実行出来るようにして、そのショートカットを必ず管理者として実行することを設定し、無事自動化完了。
 
色々迷走しましたが、手作業でやればおそらく慣れた人でも1分は掛かっていたであろう作業を、1秒に短縮することが出来ました。
 
たった1分の自動化ですが、細かい作業ってどうしても集中力が必要ですし、手入力で文字を打つのもタイプミスなど人的エラーのリスクがあるので、意外と馬鹿に出来ません。
 
そして今回の自動化実現にあたり、
・管理者として実行することで、上書き禁止ファイルも上書き出来ること
PowerShellの基本的な使い方、コマンド、文法など
PowerShellスクリプトのショートカットファイルからダブルクリックでスクリプトを実行する方法
・アプリを毎回管理者として実行するように設定する方法
 
などなど、これまで知らなかったことをたくさん知ることが出来ました。特にPowerShellを実際に活用するのは初めてだったため、かなり慣れることが出来たように思います。
 
小さな自動化を個人的にオススメしている理由の半分はこれで、「自動化を実現するまでに経験すること」が、もしかしたら今後他のことにも活かせる可能性があるんですよね。
自動化自体も嬉しいことですが、自動化にあたっていろんな手段を知り、1つ自動化出来たらまた他の業務の自動化を考え、その際これまでに経験したことから応用出来ることは無いかを考える。
 
面倒なことは嫌いなので、どんどん自動化して楽したい。(自分の中の手札を増やすためにも、これからもさらに自動化に励みたいですね)
 
ということで、しょぼい自動化をなんとか実現 したお話でした。
最後まで読んでいただきありがとうございました。