【bat】複数フォルダのlogを対象フォルダに移動する(メニュー有)

どうも、退屈なことはbatにやらせている 0 -Ray- です!

今回は私が作成し、実際に使っているbatファイルを紹介していきます!

今回のbatでできること複数のlogを指定したフォルダに移動する

このbatは検証作業用に作成しました!
別マクロで同じようなlogを取得し、試験の項番毎のフォルダに移動する。なんてことない作業ですが、何百項目もあると、毎回手動で移動するのも中々大変でした。
正直劇的に工数が減ったわけではありませんが、制作過程は勉強になりましたし、作業が少し楽になったので作成して良かったと思ってます!

つい思い出話をしてしまいました、、さっそく本題にいきましょう!
一番最後にダウンロードできるリンクを用意するのでご自由にお使いください!

こちらの記事ではメニュー表示 がある少し凝った版のbatを解説しております。
簡易版は 別記事 で解説します。

スポンサーリンク

前提

・移動元のフォルダ構成
 試験前にマクロを起動して、以下のフォルダ構成でlogを取得してました。
 このフォルダ配下に各種機器のlogが格納されるイメージです。ここは任意に変更可能です。
 解説する際はこちらが移動元となる想定で解説します。
C:\Users\test-pc\log>tree
C:.
├─all
│ └─Ap
├─cpu
├─operation
├─snmp
└─syslog

・移動先のフォルダ構成
 フォルダを作るコードは含まれておりません。(別途batで作成してました。)
 このフォルダ配下に各種機器のlogを格納するイメージです。ここも任意に変更可能です。
 解説する際はこちらが移動先となる想定で解説します。
C:\Users\test-pc\log\test\No1
├─after
│ └─Ap
├─before
│ └─Ap
├─cpu
├─operation
├─snmp
└─syslog
 

コード

@echo off
REM ----- メニュー表示バッチ・ファイル

@set alllog=C:\Users\test-pc\log\all\
@set cpu=C:\Users\test-pc\log\cpu\
@set snmp=C:\Users\test-pc\log\syslog\
@set syslog=C:\Users\test-pc\log\snmp\
@set ope=C:\Users\test-pc\log\operation\
@set file=*.log

:TOP
cls
echo ※フォルダパスはエクスプローラーのアドレスバーをそのままコピーすることを推奨します。
set /P STR_INPUT="cpu,syslog,trap 内のファイルを移動します。移動先のフォルダパスを入力して下さい: "

:MEN

echo *****************************************************************
echo * menu                                                          *
echo *                                                               *
echo *   0:change_directory                                          *
echo *   1:all                                                       *
echo *   2:cpu                                                       *
echo *   3:syslog                                                    *
echo *   4:trap                                                      *
echo *   5:operation                                                 *
echo *   9:end                                                       *
echo *                                                               *
echo *****************************************************************
 
:MENUSTART
 
set USR_INPUT_STR=
set /P USR_INPUT_STR="番号を入力してください: "
 
if %USR_INPUT_STR%==0 (
  goto TOP
) else if %USR_INPUT_STR%==1 (
  goto ALL
) else if %USR_INPUT_STR%==2 (
  goto CPU
) else if %USR_INPUT_STR%==3 (
  goto SYS
) else if %USR_INPUT_STR%==4 (
  goto TRA
) else if %USR_INPUT_STR%==5 (
  goto OPE
) else if %USR_INPUT_STR%==9 (
  goto EXITTRAP
) else (
  echo メニューにその番号はありません。
  echo.
  goto MENUSTART
)

REM ALL
:ALL

set /P A_B="beforeかafterか選択してください(a/b): "

if %A_B%==b (
move %alllog%%file% %STR_INPUT%\before\
xcopy /e /y %alllog%\ %STR_INPUT%\before\
rmdir /q /s %alllog%\Ap
echo beforeに移動完了しました。
pause
cls
) else if %A_B%==a (
move %alllog%%file% %STR_INPUT%\after\
xcopy /e /y %alllog%\ %STR_INPUT%\after\
rmdir /q /s %alllog%\Ap
echo afterに移動完了しました。
pause
cls
)else (
echo 無効な文字列です。a or b の入力をお願いいたします。
pause
cls
)
cls
goto MEN
 
REM CPU
:CPU
move %cpu%%file% %STR_INPUT%\cpu\
echo cpu移動完了しました。
pause
cls
goto MEN
 
REM SYS
:SYS
move %snmp%%file% %STR_INPUT%\syslog\
echo syslog移動完了しました。
pause
cls
goto MEN

REM TRA
:TRA
move %syslog%%file% %STR_INPUT%\trap\
echo trap移動完了しました。
pause
cls
goto MEN

REM OPE
:OPE
move %syslog%%file% %STR_INPUT%\operation\
echo operation移動完了しました。
pause
cls
goto MEN
 
:EXITTRAP
echo.
echo 終了します。
pause

長い!ですが、処理自体は単純なので適宜解説していきます!

コード解説

@echo off
REM ----- メニュー表示バッチ・ファイル

@set alllog=C:\Users\test-pc\log\all\
@set cpu=C:\Users\test-pc\log\cpu\
@set snmp=C:\Users\test-pc\log\syslog\
@set syslog=C:\Users\test-pc\log\snmp\
@set ope=C:\Users\test-pc\log\operation\
@set file=*.log

ここはいつもの要件定義です。
移動元のフォルダ構成を定義づけしてます。

:TOP
cls
echo ※フォルダパスはエクスプローラーのアドレスバーをそのままコピーすることを推奨します。
set /P STR_INPUT="cpu,syslog,trap 内のファイルを移動します。移動先のフォルダパスを入力して下さい: "

ここでユーザーがlogを格納するフォルダを STR_INPUT に格納します。
アドレスバーからコピー&ペーストでできるようにしてます。
前提に従って具体例を挙げると C:\Users\test-pc\log\test\No1 が入力される想定です。
以下の解説でもこのフォルダに移動する想定で解説します。

:MEN

echo *****************************************************************
echo * menu                                                          *
echo *                                                               *
echo *   0:change_directory                                          *
echo *   1:all                                                       *
echo *   2:cpu                                                       *
echo *   3:syslog                                                    *
echo *   4:trap                                                      *
echo *   5:operation                                                 *
echo *   9:end                                                       *
echo *                                                               *
echo *****************************************************************

こちらはメニュー表示です。
任意に変更できます!

set USR_INPUT_STR=
set /P USR_INPUT_STR="番号を入力してください: "

ここでユーザーがメニューに従って番号を入力し、 USR_INPUT_STR に格納します。
番号はメニューに表示されていて、それぞれの処理に移動できるようにしてます。

if %USR_INPUT_STR%==0 (
  goto TOP
) else if %USR_INPUT_STR%==1 (
  goto ALL
) else if %USR_INPUT_STR%==2 (
  goto CPU
) else if %USR_INPUT_STR%==3 (
  goto SYS
) else if %USR_INPUT_STR%==4 (
  goto TRA
) else if %USR_INPUT_STR%==5 (
  goto OPE
) else if %USR_INPUT_STR%==9 (
  goto EXITTRAP
) else (
  echo メニューにその番号はありません。
  echo.
  goto MENUSTART
)

ここで前述の番号に従ってそれぞれの処理に移動します。
今回はラベル(TOP,ALL,CPUなど)を使用してます’。

REM ALL
:ALL

set /P A_B="beforeかafterか選択してください(a/b): "

if %A_B%==b (
move %alllog%%file% %STR_INPUT%\before\
xcopy /e /y %alllog%\ %STR_INPUT%\before\
rmdir /q /s %alllog%\NCS
echo beforeに移動完了しました。
pause
cls
) else if %A_B%==a (
move %alllog%%file% %STR_INPUT%\after\
xcopy /e /y %alllog%\ %STR_INPUT%\after\
rmdir /q /s %alllog%\NCS
echo afterに移動完了しました。
pause
cls
)else (
echo 無効な文字列です。a or b の入力をお願いいたします。
pause
cls
)
cls
goto MEN

このコード以下は同じような処理となっているので、代表として ALL の処理を解説します。

set /P A_B=”beforeかafterか選択してください(a/b): “ についてはALL独自の処理です。
これは前提の移動元フォルダをご覧いただければわかる通り、取得logが同一のため、作業前後で同じフォルダに格納してます。
しかし、移動先はbeforeとafterでフォルダを分けているため、その判定をユーザーにしていただくための処理です。

if %A_B%==b (
move %alllog%%file% %STR_INPUT%\before\
xcopy /e /y %alllog%\ %STR_INPUT%\before\
rmdir /q /s %alllog%\Ap
echo beforeに移動完了しました。
pause
cls
)

まずは b が選択された際の処理です。
move コマンドで logを移動します。
%alllog%%file% → \Users\test-pc\log\all\*.log を
%STR_INPUT%\before\ → C:\Users\test-pc\log\test\No1\before\ に
格納します。

続いて xcopy コマンドでフォルダごとコピーし、 rmdir コマンドで移動元フォルダを削除します。
※moveだとフォルダの移動はできないので、、

%alllog% → \Users\test-pc\log\ 配下のフォルダを
%STR_INPUT%\before\ → C:\Users\test-pc\log\test\No1\before\ に
格納します。
/e でフォルダの中身ごとコピーできます。
/y で上書きの確認メッセージを省略します。

その後、移動元のApフォルダを削除します。

pause は何かボタンを押すまで処理を一時停止するコマンドです。
設定することで前述の echo で指定した
「beforeに移動完了しました。」
の文字列をユーザーが確認できるようにします。

最後に cls でコマンドプロンプト上のテキストをクリアして、後続の処理に繋げます。

Download

以下が実際に使用しているbatです!ご自由にどうぞ!
ご自身の環境に合わせて変更するのをお忘れなく

最後までご覧いただきありがとうございます!
それでは良いエンジニアライフを!!

コメント

タイトルとURLをコピーしました