Windowsバッチファイル

実践!バッチファイルで業務を自動化する【バックアップ・ログ整理・一括リネーム】

Windowsバッチファイル
記事内に広告が含まれています。

これまで学んだバッチファイルの技術を組み合わせて、実際に使える業務自動化バッチを3本作ります。コードの各行に何をしているかのコメントを付けて解説します。

実践1:日付付きバックアップバッチ

指定したフォルダを日付フォルダに差分バックアップします。ログも自動で記録します。

@echo off
setlocal

rem ===== 設定 =====
set SRC=C:\work                              ← バックアップ元
set DST_BASE=D:\backup                       ← バックアップ先(日付フォルダを作る場所)
set LOG_DIR=C:\logs                          ← ログの保存先

rem ===== 日付・ファイル名の設定 =====
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set DST=%DST_BASE%\%DATE_STR%               ← 例: D:\backup\20260424
set LOG=%LOG_DIR%\backup_%DATE_STR%.log     ← 例: C:\logs\backup_20260424.log

rem ===== ログフォルダの作成 =====
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

rem ===== 処理開始ログ =====
echo === バックアップ開始: %DATE% %TIME% === > "%LOG%"
echo コピー元: %SRC% >> "%LOG%"
echo コピー先: %DST% >> "%LOG%"

rem ===== ソースの存在確認 =====
if not exist "%SRC%" (
    echo エラー: ソースが見つかりません: %SRC% >> "%LOG%"
    echo エラー: バックアップ元フォルダが見つかりません
    exit /b 1
)

rem ===== バックアップ先フォルダ作成 =====
if not exist "%DST%" mkdir "%DST%"

rem ===== robocopyで差分バックアップ =====
rem /E = サブフォルダも含む、/XO = 既に新しいファイルはスキップ
robocopy "%SRC%" "%DST%" /E /XO /LOG+:"%LOG%"

rem ===== 結果確認(robocopyは7以下が正常) =====
if %errorlevel% leq 7 (
    echo バックアップ完了: %DATE% %TIME% >> "%LOG%"
    echo バックアップが完了しました → %DST%
) else (
    echo エラー発生 終了コード: %errorlevel% >> "%LOG%"
    echo エラーが発生しました。ログを確認してください: %LOG%
    exit /b %errorlevel%
)

exit /b 0

実践2:古いファイルの自動削除バッチ

指定した日数より古いログファイルを自動削除します。forfiles コマンドの /d オプションで「N日前より古いファイル」を条件にします。

@echo off
setlocal

rem ===== 設定 =====
set LOG_DIR=C:\logs
set KEEP_DAYS=30                             ← 何日分のログを残すか

echo %KEEP_DAYS%日以上前のログファイルを削除します
echo 対象フォルダ: %LOG_DIR%
echo.

rem ===== forfilesで古いファイルを検索・削除 =====
rem /p = 対象フォルダ、/s = サブフォルダも対象、/m = ファイルパターン
rem /d = 最終更新日が指定日数より前のファイル(-30で30日前)
rem /c = 実行するコマンド(@path = ファイルのフルパス)
forfiles /p "%LOG_DIR%" /s /m *.log /d -%KEEP_DAYS% /c "cmd /c echo 削除: @path & del @path"

if %errorlevel% equ 0 (
    echo 削除完了
) else (
    echo 対象ファイルなし(または削除エラー)
)
pause

実践3:ファイルの一括リネームバッチ

フォルダ内の画像ファイルを「photo_001.jpg」「photo_002.jpg」…のように連番でリネームします。遅延展開とゼロパディング(001, 002…)を活用します。

@echo off
setlocal enabledelayedexpansion

rem ===== 設定 =====
set TARGET_DIR=C:\photos
set PREFIX=photo
set EXT=.jpg
set COUNT=1

echo フォルダ: %TARGET_DIR%
echo リネーム開始...

rem ===== for /r でファイルを列挙してリネーム =====
for %%f in ("%TARGET_DIR%\*%EXT%") do (
    rem カウンターを3桁のゼロ埋め形式にする
    set NUM=00!COUNT!
    set NUM=!NUM:~-3!             ← 末尾3文字を取り出す(001, 002...)
    
    set NEW_NAME=%PREFIX%_!NUM!%EXT%
    echo %%~nxf → !NEW_NAME!
    
    ren "%%f" "!NEW_NAME!"
    set /a COUNT+=1
)

echo.
echo リネーム完了: !COUNT!件処理しました
pause

まとめ

  • robocopyで差分バックアップ。errorlevel 7以下が正常という点を忘れずに
  • forfilesの /d オプションで「N日前より古いファイル」を条件にして一括削除できる
  • 遅延展開と !COUNT! でループ内カウンターを正しく更新できる
  • set NUM=!NUM:~-3! で末尾3文字を取り出してゼロ埋め3桁の数字を作る

この3つのバッチはどれも実際の現場で使ってきたものです。特にバックアップバッチは「動いているように見えてエラーコードを確認していなかった」という失敗を経験したので、必ずerrorlevelチェックとログ出力を入れるようにしています。

hobbyshift管理人

コメント

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