導入
仕上げに、これまで学んだ要素を組み合わせた実用的なバッチを読み解きます。「指定したフォルダを、今日の日付を付けた名前でバックアップする」スクリプトです。変数・引数・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 の下に、日付つきのコピーができれば成功です。おつかれさまでした ―― これでバッチファイルの基礎はひと通りマスターです!