これまで学んだバッチファイルの技術を組み合わせて、実際に使える業務自動化バッチを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管理人



コメント