@echo off
setlocal EnableDelayedExpansion
rem Build date string for new backup copy
set MyDate=%DATE:~4,2%_%DATE:~7,2%_%DATE:~10,4%
rem Define source and destination paths
set BaseDir=C:\Program Files (x86)\Camelot3\Database
set DestDir=F:\Camelot
set BaseFile=%BaseDir%\CAMDB.FDB
set DestFile=%DestDir%\Camdb_%MyDate%.fdb
rem Make sure the file to backup exists
if not exist "%BaseFile%" (
echo *ERROR* database file to backup does not exist
exit /b
)
rem Make sure the dest folder exists, create it if needed
if not exist "%DestDir%" (
mkdir "%DestDir%"
)
rem Get size (in bytes) of current file, left pad to build 16 byte string of size
for %%A in ("%BaseFile%") do set BaseSize=%%~zA
set BaseSize=0000000000000000%BaseSize%
set BaseSize=%BaseSize:~-16%
:CheckSpace
rem Get free space (in bytes) of dest drive, left pad to build 16 byte string of size
for /f "tokens=3" %%A in ('dir "%DestDir%"\^|find /i "bytes free"') do set "DestFree=%%A"
set DestFree=!DestFree:,=!
set DestFree=0000000000000000!DestFree!
set DestFree=!DestFree:~-16!
rem If this file won't fit, try to delete oldest backup
if "%BaseSize%" GTR "!DestFree!" (
rem Doesn't fit, look for oldest file to delete
set DeleteFile=
for /f "tokens=*" %%A in ('dir /a-d /b /o-d "%DestDir%"') do set DeleteFile=%DestDir%\%%~A
rem If no files to delete in destination folder error out
if not defined DeleteFile (
echo *ERROR* No room for backup copy on destination drive, quiting
exit /b
)
rem Delete oldest file, check if it fits now
del "!DeleteFile!" >NUL
goto :CheckSpace
)
rem Since it should fit, copy it now
copy /z "%BaseFile%" "%DestFile%"