0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsバッチ(.bat)学習メモ 7zipで指定月数前に出力されたものを圧縮・bkフォルダへ移動・圧縮元を削除する処理

Posted at

日次や週次で生成されるフォルダ群のうち、nヵ月前のものを圧縮する処理。

※想定
・圧縮対象は、生成日次を用いた「yyyymm」を名称に含むようなフォルダである
・圧縮により生成された7zファイルは、圧縮元が存在するディレクトリ配下のbackup\yyyymm\yyyymm.7z、へ配置される。(yyyymmは、nヵ月前の年月をyyyymm形式で表したもの)
・同じ階層に、呼び出し元(Controller.bat)も、呼び出され側(Service.bat)も、両方存在している前提


Controller.bat
@echo off
setlocal enableDelayedExpansion

::ーーーーーーーーーーーーーーーーーーーーーーーーー

rem コンフィグ

::◆この処理の中核となるbatファイルのパス
set serviceBatFileName=service.bat
set serviceBat=%cd%\%serviceBatFileName%

::◆この処理の対象となるディレクトリのパス
set cmnPath=(パス)
set tgtDir[1]=!cmnPath!\(圧縮したいものがいるディレクトリのパス1)
set tgtDir[2]=!cmnPath!\(圧縮したいものがいるディレクトリのパス2)
set tgtDir[3]=!cmnPath!\(圧縮したいものがいるディレクトリのパス3)

::◆7zipの実行ファイルのパス
set zipper=(「7-Zip\7z.exe」のパス)

::◆圧縮するファイルが、実行時のnヵ月前なのかを指定
set howManyMonthAgo=(12以下の任意の自然数)

::ーーーーーーーーーーーーーーーーーーーーーーーーー

rem 変数準備

::◆実行時の年月日を取得(それぞれyyyy、mm、dd形式)
set yyyyNow=%date:~0,4%
set mmNow=%date:~5,2%
set ddNow=%date:~8,2%

::◆実行時のnヵ月前の年月を取得(それぞれyyyy、mm形式)
if %mmNow% leq %howManyMonthAgo% (
    set /a mmTgt=%mmNow%+(12-%howManyMonthAgo%)
    set /a yyyyTgt=%yyyyNow%-1
) else (
    set /a mmTgt=%mmNow%-%howManyMonthAgo%
    set yyyyTgt=%yyyyNow%
)
set mmTgt=0!mmTgt!
set mmTgt=!mmTgt:~-2!

::ーーーーーーーーーーーーーーーーーーーーーーーーー

rem 実行前確認

:reQuestion
echo このbatは、(手順の概要)を自動実行するものです。
set /p answer=処理を実行してもよろしいですか?[y/n]
if "!answer!"=="y" (
    goto exeProcess
) else (
    if "!answer!"=="n" (
        echo 処理の実行が拒否されました。
        goto processAllFinish
    ) else (
        echo 「y」または「n」で回答してください。
        goto reQuestion
    )
)

::ーーーーーーーーーーーーーーーーーーーーーーーーー

:exeProcess
echo.
echo ★★★全体処理開始★★★

rem ※呼び出され側に渡す引数の内容
:: 第一引数=圧縮対象が存在するディレクトリのパス
:: 第二引数=圧縮対象の名前(後にdirコマンドで検索をかけるため、ワイルドカードによる指定も可能)
:: 第三引数=圧縮後の7zファイルのパス
:: 第四引数=実行する7zExeのパス
:: 第五引数=実行時のnヵ月前(yyyymm形式)

rem 処理実行
for /l %%i in (1,1,(処理の対象となるディレクトリの総数)) do (
    rem ◆処理対象ごとに値を用意(圧縮対象が存在するディレクトリのパス)
    set tgtDir=!tgtDir[%%i]!
    rem ◆処理対象ごとに値を用意(7zファイル配置場所)
    set zippedFileName=!tgtDir!\backup\%yyyyTgt%\%yyyyTgt%%mmTgt%.7z
    rem ◆処理対象ごとに値を用意(圧縮対象の名前)
    set searchTgt=!tgtDir!\%yyyyTgt%%mmTgt%*

    rem ◆処理
    echo.
    echo ~~~~~%%i個めの処理開始~~~~~
    echo 【対象環境:!zippedFIleName!call %serviceBat% !tgtDir! !searchTgt! !zippedFIleName! !zipper! %yyyyTgt%%mmTgt%
    echo ~~~~~%%i個めの処理終了~~~~~
    echo.
)

echo ★★★全体処理終了★★★

::ーーーーーーーーーーーーーーーーーーーーーーーーー

pause

呼び出される側.bat
@echo off
setlocal enableDelayedExpansion

rem コンフィグ
set logDir=(ログを出力させたいパス)
set zipTargetListLogName=(圧縮対象の名前のリストを記すファイルの名前)
set zipExeLogName=(7z実行時ログを記すファイルの名前)
set workDirName=(作業フォルダの名前)

rem 引数をチェック
if "%1"=="" (
    echo 引数がありません。
    goto processStop
) else (
    if "%2"=="" if "%3"=="" if "%4"=="" if "%5"=="" (
        echo 引数が不足しています。
        goto processStop
    ) else (
        set tgtDir=%1
        set searchTgt=%2
        set zippedFileName=%3
        set zipper=%4
        set yyyymm=%5
    )
)

rem 作業フォルダを作成
::◆実行時の時刻を取得(hhmmss_mm形式)
set startExeTime=0%time::=%
set startExeTime=!startExeTime:.=_!
set startExeTime=!startExeTime:~-9!
::◆フォルダを作成
set workDir=%tgtDIr:"=%\%workDirName%\%startExeTime%実施分
::" "マークダウン上のコメントアウト化回避用ダブルクォート 実働時には消しても問題ない"
if not exist %workDir% (
    mkdir "%workDir%\%yyyymm%" /p
)

rem 圧縮対象を検索し、一か所にまとめる
set count=0
for /f "delims=" %%a in ('dir /b /ad %zipTarget%') do (
    set /a count+=1
    set beforeZipFile=%tgtDir:"=%\%%a
    ::" "マークダウン上のコメントアウト化回避用ダブルクォート 実働時には消しても問題ない"
    move "!beforeZipFile!" "%workDir%\%yyyymm%" >nul
    echo "!beforeZipFile!" >> "%logDir%\%zipTargetListLogName%.log"
)

rem まとめたフォルダを、実際に圧縮する(対象が無ければ、なにもしない)
if !count!==0 (
    echo 圧縮対象はありませんでした。
    goto deleteWorkDir
) else (
    echo !count!個の対象が見つかりました。
    echo!zippedFileName!】への圧縮を実行します。
    echo 圧縮には時間がかかります。しばらくお待ちください...
    %zipper% a -mx=9 -mmt=on !zippedFileName! "%workDir%\%yyyymm%" >> "%logDir%\%zipExeLogName%.log"
    msg * "圧縮が完了しました。"
    echo 圧縮が完了しました。
)

rem 圧縮対象を一か所にまとめたものを、削除するか確認する
:reQuestion
'dir /b /ad %zipTarget%'
set /p answer=これらの圧縮対象を削除してもよろしいですか?[y/n]
if "!answer!"=="y" (
    echo 圧縮対象を削除します。しばらくお待ちください...
    goto deleteWorkDir
) else (
    if "!answer!"=="n" (
        echo 削除が拒否されました。
        echo 後に削除する場合、圧縮対象は下記にまとまっていますのでこちらを参照してください。
        echo "%workDir%\%yyyymm%"
        goto processFinish
    ) else (
        echo 「y」か「n」で入力してください。
        goto reQuestion
    )
)

rem 圧縮対象を削除
:deleteWorkDir
rmdir /s /q "%tgtDir:"=%\%workDirNamr%"
::" "マークダウン上のコメントアウト化回避用ダブルクォート 実働時には消しても問題ない"
msg * "完了"
echo 完了
goto processFinish

rem 終了
:processStop
echo 処理を中止しました。
:processFinish
pause
exit /b
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?