会社で、サーバ上のプロジェクトフォルダ下の各作業工程フォルダ下に、ログ退避フォルダを設置する定期作業が、月に2回程度の頻度で発生していました。作業工程フォルダは多数あり、手作業では手間が掛かるうえ、毎回設置漏れが発生する状況でした。今回は、創意工夫活動の一環として、該当作業をDOSバッチで自動化し、作業効率化を図ってみたので、その過程を備忘録として記事にまとめました。
ログ退避フォルダ設置作業の詳細
ログ退避フォルダ設置場所までのディレクトリは、サーバ上の各プロジェクトフォルダ直下にログ退避フォルダが設けられ、配下に各作業工程フォルダが、格納される配置になっています。今回は、これら作業工程フォルダ直下に、仕向けコードをフォルダ名にして、ログ退避フォルダを設置する工程をバッチ化しました。本作業は、プロジェクトフォルダ名の先頭にリリース日が入り、各プロジェクト名の規則性も乏しい為、作業パスの固定化が難しく、手作業によるログ退避フォルダ設置が続いていました。
DOSバッチ化したい事
以上を踏まえて、バッチのコマンド構成を以下に具体化しました。
- ユーザ入力で、ログ退避フォルダ設置対象パスとログ退避フォルダ名(仕向けコード)を取得
- ログ退避フォルダの設置は、ループ処理で実装
- 2.より、事前にループ内変数使用設定(遅延環境変数の展開)を行う
- 2,3.より、事後にループ内変数使用設定解除(遅延環境変数の展開終了)を行う
作成したDOSバッチ
以上を踏まえて、以下の様なDOSバッチ(set_logfolder.bat)を作成しました。
コマンド説明
「echo」コマンド
バッチ冒頭の「echo」コマンドで、バッチ起動時のプロンプト画面の表示調整を行っています。「@echo off」で、エコー機能を切り、コマンドの実行結果のみ表示にして画面を見やすくしています。「echo.」で空行を挿入し、「echo ~」で任意文字裂(~)を表示します。また行末2行は、先頭行と対の常套句としてバッチ処理ではよく使われます。「pause」でプロンプト画面に「続行するには何かキーを押してください . . .」を表示して処理中断を行います。batファイルのダブルクリック起動でも、処理後のプロンプト画面のクローズが保留され、処理結果が確認しやすくなります。「@echo on」で、エコー機能を再開し、バッチを終了します。
@echo off
echo.
echo *** ログ退避フォルダ設置対象パス入力 ***
echo.
pause
@echo on
以上を例えば「test.bat」等、batファイルにまとめてダブルクリックで起動すると、以下のようなプロンプト画面が表示されます。
「set」コマンド
「set」コマンドに「/P」オプションを付けて、右記書式「set /P [変数]=”[入力内容説明]”」と、記述する事で、ユーザからのプロンプト画面入力を取得し、任意の変数に格納しています。「set /P SetPath=~」で「ログ退避フォルダ設置対象パス」、「set /P LogFolder=~」で「ログ退避フォルダ名(仕向けコード)」を、それぞれ取得します。
set /P SetPath="ログ退避フォルダ設置対象のパスを入力してください:"
set /P LogFolder="設置するログ退避フォルダ名を入力してください:"
以上を「test.bat」の起動から表示し、プロンプト画面入力を行った状態は以下の通り。
「遅延環境変数の展開」設定
ログ退避フォルダの設置は、forループ処理で実装するので、ループ内で変数が正常に使用できるよう、事前に「setlocal enabledelayedexpansion」と記述し「遅延環境変数の展開」設定を行いました。この設定を行わずに、forループ内で変数を使用すると、変数も含めてループ内の処理が一気に読み込まれる為、ループ内で代入を行った変数に対する参照が、期待通りの挙動になりません。「遅延環境変数の展開」については、「知識ゼロからのwindowsバッチファイル超入門」と言うサイトに詳しい解説があるので、詳細については、そちらを参照下さい。
rem ループの中での変数使用設定
setlocal enabledelayedexpansion
「遅延環境変数の展開」設定を行う場合、その効力が及ぶ範囲(スコープ)を区切る必要があるので、「遅延環境変数の展開」の必要な処理を抜けたら、終了位置を示す「endlocal」を記述します。
rem ループの中での変数使用設定解除
endlocal
「for」コマンドとループ内処理
作業工程フォルダのパス取得には、「for」コマンドに「/d」オプションを付けた、フォルダ読込み書式「for /d %%[アルファベット1文字] in ([フォルダ名]) do ([処理内容])」を使用しました。「for /d %%i in (!SetPath!\*) do (~)」と記述し、「!SetPath!\*」で「ログ退避フォルダ設置対象パス」配下をワイルドカード参照し、全作業工程フォルダのパスを、一つづつループ内変数「%%i」に読込む段取りです。※遅延環境変数の展開設定下では、変数参照に「%」ではなく「!」を使用するので注意
続けて「do (~」内の処理内容は、「set SetFolder=%%i」で「ログ退避フォルダ設置対象パス\各作業工程フォルダ」パスを取得しています。さらに「mkdir !SetFolder!\!LogFolder!」にて、「各作業工程フォルダ」直下に「ログ退避フォルダ」を設置しています。
rem ログ退避フォルダ設置対象パス直下のディレクトリ分ループ処理
for /d %%i in (!SetPath!\*) do (
rem 対象バス直下の各ディレクトリにログ退避フォルダを設置
set SetFolder=%%i
echo !SetFolder!\!LogFolder!
rem mkdir !SetFolder!\!LogFolder!
)
注)上記は作成中の構成なので、「ログ退避フォルダ」設置部分をコメントアウトし、デバック用に「echo」コマンドを挿入しています。「echo !SetFolder!\!LogFolder!」にて「ログ退避フォルダ」までのパス取得状況をプロンプト画面に出力し、バッチ動作を確認しました。ここまでの経緯より、「test.bat」起動からのプロンプト画面表示は以下の通りです。
動作確認
テスト環境の事前準備
作成したログ退避フォルダ設置バッチ(set_logfolder.bat)を、ローカル環境の任意の場所に配置
サーバ側のプロジェクトフォルダ構成は、NAS上にテスト環境を作成
テスト
ログ退避フォルダ設置バッチをダブルクリックで起動
ログ退避フォルダ設置対象パスの入力⇒手入力は手間なので、下図のようにエクスプローラのフォルダパス表示欄のフォルダアイコンを、プロンプト画面にドラック&ドロップし、対象フォルダパスを入力
続けて、ログ退避フォルダ名を入力し、エンター押下⇒「続行するには何かキーを~」文言が表示されたら、任意のキーを押下してバッチを終了する
入力した、対象パス配下の各作業工程フォルダ直下に、入力ファイル名で、ログ退避フォルダが作成されている事を確認する
テスト(エラー時)
以上テストに続けて、再度ログ退避フォルダ設置バッチを起動し、前回テストと全く同じ内容を入力して、エンターを押下⇒「mkdir」コマンドの仕様で、既にあるフォルダ名を指定した場合、下図の通りエラーが表示されることを確認
まとめ
本件のように、定位置に同じ名前のフォルダを作る等の単純作業の場合、VBA等でプログラムを組むより、DOSバッチを作成した方がコンパクトに納まり、処理も早いと思います。但し、DOSバッチには、ループ内で複数行に渡る処理で変数を扱う場合は、事前に「遅延環境変数の展開」設定が必要など、独特のクセがあり、コマンド構成時に注意が必要です。
その他補足
ここまでの経緯を踏まえ、「mkdir」⇒「rmdir」コマンドに挿げ替え、以下の通り、定位置の「ログ退避フォルダ撤去」バッチも作ってみました。バッチ処理の性質上「rmdir」コマンドに「/s」「/q」オプションを付けた記述になります。「rmdir /s /q !SetFolder!\!LogFolder!」にて、「各作業工程フォルダ」直下の「ログ退避フォルダ」を、配下のファイルやサブディレクトリも含めて、確認メッセージの表示無しに削除してしまうので、使用には注意が必要です。
参考文献
- 「知識ゼロからのwindowsバッチファイル超入門」”バッチファイルを作成する” 2021年4月29日閲覧
- 株式会社バズワード(2014-)「Let’sプログラミング」”エコー機能のON/OFFを切り替える(ECHO)” 2021年4月29日閲覧
- 「知識ゼロからのwindowsバッチファイル超入門」”pause(バッチファイルの処理を一時停止する)” 2021年4月29日閲覧
- 「知識ゼロからのwindowsバッチファイル超入門」”set(変数の設定・計算・ユーザーからの入力情報の取得)” 2021年4月29日閲覧
- 「知識ゼロからのwindowsバッチファイル超入門」”forループの中で値を変化させる” 2021年4月29日閲覧
- Increments Inc.(2011-)「Qiita」 “.bat(バッチファイル)のforコマンド解説。” 2021年4月29日閲覧
- 「知識ゼロからのwindowsバッチファイル超入門」”mkdir(md)(新規フォルダを作成する)” 2021年4月29日閲覧
- k-tanaka(2002–)「k-tanaka.net」”コマンドプロンプトWindowsの便利な使い方 ディレクトリを削除する” 2021年4月29日閲覧
コメント