業務内容の中に以下の作業内容が入っていました。
「サーバーのディレクトリ内に当日日付のファイルが格納されているか確認する。」
こんなのパスを入力して見に行ったらチョロで終わるっしょ。
…っと思ってましたが見に行くディレクトリが数十ある上に
一個ずつ開いて行ったらどこまで開いたか分からなくなりますね。
おまけにこんなしょうもない作業を必死こいてやりたくない、楽したい。WTF
っというわけで完全自動化まではいかないまでも、
もう少し楽に情報を取得して作業を効率化したいと思います。
頑張ってる俺凄い系前任者への愚痴はまた別の機会に書きます
プログラムの仕様
以下の仕様で作っております。
- ネットワークディレクトリにアクセスする
- ディレクトリ内の情報をDir関数を使って取得する
- 取得したディレクトリ内の情報をテキストファイルに出力する
用意するもの
- Windows10のPC
- ネットワークディレクトリにアクセスできること(要権限)
- バッチファイルを実行し、テキストファイルを出力できるローカルディレクトリ
プログラム
実際に作成したプログラムを書いておきます。
REM 処理日付表示
set CURRENTDATE=%date:~0,4%%date:~5,2%%date:~8,2%
REM 出力場所指定
REM 起動用batファイルと同じ場所にtextファイルを出力
set SAVEDIR=%~dp0%CURRENTDATE%.txt
REM 新規ファイル作成(同名のファイルがあったら上書き)
echo %CURRENTDIR%処理 > %SAVEDIR%
REM 対象ディレクトリ指定(必要な数だけ増やしていく)
CALL :MAIN \\192.168.1.10\netdir1
CALL :MAIN \\192.168.1.10\netdir2
CALL :MAIN \\192.168.1.11\netdir11
exit /b
REM 主処理ここから
:MAIN
echo * START ************************************************* >> %SAVEDIR%
echo %1 >> %SAVEDIR%
echo " "
REM ネットワークドライブを設定
pushd %1
REM ディレクトリ情報を取得して出力する(再帰的)
dir * /a-d/s >> %SAVEDIR%
REM 解除前に移動しておく
c:
REM ネットワークドライブを解除
popd %1
echo " "
echo * END ************************************************* >> %SAVEDIR%
timeout /nobreak 1
exit /b
REM 主処理ここまで
解説
軽く解説していきたいと思います。
その1
今日の日付を取得してyyyymmdd形式に変換しています。
REM 処理日付表示
set CURRENTDATE=%date:~0,4%%date:~5,2%%date:~8,2%
その2
バッチファイルと同じディレクトリにファイルを保存します。
名前は「yyyymmdd.txt」という名前にしています。
「バッチファイルと同じディレクトリ」を設定するには%~dp0
で指定しています。
REM 出力場所指定
REM 起動用batファイルと同じ場所にtextファイルを出力
set SAVEDIR=%~dp0%CURRENTDATE%.txt
その3
上記で指定したディレクトリのファイルに出力します。
ディレクトリにファイルがなかったら新規作成して出力します。
同じ名前のファイルが存在していたら上書き(中身を消去)して新しくファイルを作成します。
REM 新規ファイル作成(同名のファイルがあったら上書き)
echo %CURRENTDIR%処理 > %SAVEDIR%
その4
\\192.168.1.10\netdir1
←このディレクトリの情報を取得するというやり方をしています。
:MAIN
というメソッドを読み込みます。
:MAINメソッドは「主処理ここから〜主処理ここまで」のことをいいます。
REM 対象ディレクトリ指定(必要な数だけ増やしていく)
CALL :MAIN \\192.168.1.10\netdir1
exit /b
その5
%1
は引数として渡したディレクトリの値が入っています。
>>
は その2で設定したテキストファイルに出力する記号ですが、
その3のテキスト出力と違うのは、
>
はファイルに上書きでしたが、
>>
はファイルの末尾に追記する書き方になります。
echo %1 >> %SAVEDIR%
その6
pushd
コマンドを使うことで、ネットワーク上にあるディレクトリに対して、
ネットワークドライブの割り当てを自動でしてくれます。
しかも空きドライブ文字を自動で割り当ててくれるのでとてもお手軽です。
pushd %1
このpushd
コマンドの補足ですが、net use 〜
コマンドと同じ効果があります。
しかし実際にnet use 〜
コマンドを使ってみたのですが、
連続してやると挙動が怪しいといいますか、
前のディレクトリ情報のままdir関数を使っていたりして
正確性に欠ける動きをしたのでpushdコマンドを採用しております。
(そもそもこんな使い方を想定してないと思うのでバグではないと思いますが…)
その7
ここがメイン処理です。
dir関数を使ってディレクトリ内のファイル情報を取得します。
また、/sでサブディレクトリ含めて再帰的に表示します。
dir * /a-d/s >> %SAVEDIR%
その8
pushd
コマンドで設定したネットワークドライブを解除します。
直前にc:
でディレクトリを移動してますが、
これをやらないとうまく解除できません。
移動先はネットワークドライブ以外ならどこでも大丈夫です。
c:
popd %1
こんな感じでデータを取得したので、2、30分くらいの作業が約2、3分で終わりました。
10倍の作業効率化を達成できました。
塵も積もれば山になるので無駄な作業はどんどん効率的にしていきたいと思います。
一番変えたいのは…COBOLを別言語にマイグレーションしたいんだけどなぁ(笑
参考