Skip to content
Tana edited this page Sep 7, 2019 · 8 revisions

バッチ ファイルが格納されたフォルダーをカレント フォルダーにする

cd /d %~dp0

直前のコマンドでエラーが発生した場合にバッチを中断する

if errorlevel 1 exit /b

errorlevel 11 はエラーかどうかを判断するコマンドの終了コード。
コマンドによっては 1 以上がエラーであるとは限らないので適宜指定する。
(例: robocopy コマンドは終了コードがビット フラグで表現されているので扱いが特殊)

データのバックアップを自動化

robocopy コマンドを活用するとスマートなバックアップタスクを作成する事ができる。以下のバッチはミラーリングによるバックアップの参考例。

概要

過去30日分の実行ログファイルを日別に作成しつつ、バッチ内で指定したフォルダーやドライブに対してミラーリングを行う。

メリット

このバッチを作成してタスク スケジューラーで定期的に実行することでピンポイントでのバックアップを容易に運用できる。
ミラーリングなので、初回のバックアップには時間が掛かるが、2回目以降は差分のみ対象となるので処理が軽く早い。

デメリット

バックアップの世代管理は行ってない。そのため、元ファイルを削除したらバックアップ先も削除されるし、元ファイルのバイナリが壊れたらそれをそのままバックアップ先にコピーされるのでその点は注意。

コード内容

@echo off

:: バッチ名 (ログファイル名に使用)
set BatchName=FullBackup

:: ログフォルダのパス (相対パスの場合はこのログファイルのあるフォルダーが起点)
set LogDir=.\Logs
:: ログファイル名 (日別に作成)
set LogFile=%LogDir%\%BatchName%_%date:~0,4%-%date:~5,2%-%date:~8,2%.log
:: ログファイルを削除する経過日数
set LogDeleteDays=30

:: ========================================
:: 古いログファイルの削除
:: ========================================
echo 古いログファイルを削除します。(%LogDeleteDays% 日前)
echo.

:: バッチファイルが格納されたフォルダーをカレントフォルダーにする
cd /d %~dp0

forfiles /P "%LogDir%" /M "*.log" /D -%LogDeleteDays% /C "cmd /c del @path"

:: ========================================
:: バックアップ
:: ========================================

:: 「set CopyFrom=~」の行から「call :MIRROR」の行までが1セット。「set」の行でコピー条件を指定する
:: ドライブそのものをバックアップ対象にした場合、「attrib -H -S "%CopyTo%"」の行も1セットの最後に含める必要がある

:: CopyFrom: バックアップ元のパス(フォルダー、ドライブが対象)
:: CopyTo: バックアップ先のパス
:: ExcludeDir: コピー対象から除外するフォルダーの名前
::             操作アクセス権が無いもの(エラーとしてログに残るため)や、バックアップ不要なものに対して指定する
::             ダブルクォーテーションでフォルダー名をくくって指定。半角スペースを挟むことで複数のフォルダー名を指定可能
::             「*」によるワイルドカードも使用可能
:: ExcludeFile: コピー対象から除外するファイルの名前。ExcludeDirと指定方法は同じ

set CopyFrom=C:\timidity
set CopyTo=E:\Backup\C\timidity
set ExcludeDir=""
set ExcludeFile=""
call :MIRROR

set CopyFrom=C:\Users
set CopyTo=E:\Backup\C\Users
set ExcludeDir="Default" "defaultuser0" "*cache*" "Recent" "Temp" "Macromedia" "UnistoreDB" "UPPS" "Packages" "TileDataLayer"
set ExcludeFile="*NTUSER.DAT*" "*UsrClass.dat*" "*cache*" "*.tmp" "parent.lock"
call :MIRROR

set CopyFrom=D:\\
set CopyTo=E:\Backup\D
set ExcludeDir="System Volume Information" "$RECYCLE.BIN"
set ExcludeFile=""
call :MIRROR
:: ドライブ自体がコピー元になると隠し+システム属性が設定されるので解除する
attrib -H -S "%CopyTo%"

exit


:: ========================================
:: robocopyによるミラーリング
:: ========================================
:MIRROR

echo.
echo ミラーリングを行います。
echo [From]"%CopyFrom%"
echo [To  ]"%CopyTo%"

robocopy "%CopyFrom%" "%CopyTo%" /MIR /R:0 /W:0 /LOG+:"%LogFile%" /NP /NDL /XJD /XJF /XD %ExcludeDir% /XF %ExcludeFile%
exit /b

ビルド自動化

.NET Frameworkに付属しているビルドツールでビルドを行う。 Visual Studioの環境が無くてもビルドが可能となる。

@echo off

echo ビルドを開始します。

:: NuGet パッケージを復元するソリューション ファイル
set TargetSolution=XXX.sln
:: ビルドするプロジェクト ファイル
set TargetProject=XXX\XXX.vbproj
:: ビルド生成物の出力先フォルダ (※ %TargetProject% が起点)
set OutputPath=..\bin\XXX

:: NuGet パッケージ復元で使用するクライアント ツール
set NuGet=nuget.exe
:: .NET Framework 4.x のコンパイラ
set Compiler=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

cd /d %~dp0

if not exist "%NuGet%" (
	echo.
	echo NuGet パッケージのクライアント ツールが見つかりません。

	goto BREAK
)

if not exist "%Compiler%" (
	echo.
	echo .NET Framework 4.x のコンパイラが見つかりません。

	goto BREAK
)

echo.
echo NuGet パッケージを復元します。
echo.
"%NuGet%" restore "%TargetSolution%"

echo.
echo プロジェクトをビルドします。
echo.
"%Compiler%" "%TargetProject%" /p:Configuration=Release;OutputPath="%OutputPath%";PostBuildEvent="del /q *.xml"
:: Releaseビルド、出力先指定、ビルド後に.xmlファイルを全て削除している

echo.
pause
goto EOF

:BREAK
echo.
echo ビルドを中断しました。
pause