本文へスキップ
BecomeCoder

バッチファイルコース · 第5章 ファイル操作と実践 · レッスン19

実践 ― 日付つきバックアップスクリプト

導入

仕上げに、これまで学んだ要素を組み合わせた実用的なバッチを読み解きます。「指定したフォルダを、今日の日付を付けた名前でバックアップする」スクリプトです。変数・引数・if・errorlevel・ファイル操作が一度に登場します。

説明

まず全体を示します。

@echo off
setlocal

rem === 設定 ===
rem 引数でコピー元を受け取る。無ければ現在のフォルダ
set "src=%~1"
if "%src%"=="" set "src=%CD%"

rem 日付を YYYYMMDD 形式で組み立てる(環境により %DATE% の書式は異なる)
set "today=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
set "dest=%USERPROFILE%\Backups\backup_%today%"

rem === 存在確認 ===
if not exist "%src%" (
    echo コピー元が見つかりません: %src%
    exit /b 1
)

echo コピー元 : %src%
echo コピー先 : %dest%
echo.

rem === バックアップ実行 ===
robocopy "%src%" "%dest%" /e /nfl /ndl >nul

if %ERRORLEVEL% GEQ 8 (
    echo バックアップに失敗しました(コード %ERRORLEVEL%
    exit /b 1
)

echo バックアップが完了しました: %dest%
endlocal
pause

ポイントを順に見ていきます。

  • setlocal / endlocal … この間で作った変数を、バッチの外に持ち出さず後片付けする宣言です。行儀のよいバッチの作法として付けておきます。
  • %~1 … 引数 %1 から、囲みのダブルクオートを取り除いた形です。パスを安全に扱うための書き方で、これに if "%src%"=="" を組み合わせ「引数が無ければ現在のフォルダ」を既定にしています。
  • %DATE:~0,4% … 変数の一部を切り出す「部分文字列」の記法です。~0,4 は「0文字目から4文字」の意味で、%DATE%(例 2026/07/25)から年・月・日を取り出して 20260725 という文字列を組み立てています。
  • robocopy ... /e … サブフォルダも含めてまるごとコピーします。robocopy は成否の意味づけが独特で、コード 8 以上が本当の失敗 なので GEQ 8(8以上)で判定しています。

学んだ要素がひと通り詰まっています。設定を変数にまとめ、引数で柔軟にし、if で入力を守り、errorlevel で結果を確かめる ―― これが実用バッチの基本構成です。

さらに先へ 日付書式は PC の地域設定で変わるため、%DATE% の切り出し位置は環境依存です。堅牢に日付を扱いたくなったら、wmic os get localdatetime や PowerShell の Get-Date を使う方法へ進むとよいでしょう。バッチで手に負えなくなってきたら、PowerShell への乗り換えが次のステップです。

やってみよう

このバッチを backup.bat として保存し、backup.bat "コピーしたいフォルダのパス" の形で試してみましょう(まずは中身の少ないテスト用フォルダで)。%USERPROFILE%\Backups の下に、日付つきのコピーができれば成功です。おつかれさまでした ―― これでバッチファイルの基礎はひと通りマスターです!