Ну, все строки с mysqldump.exe
указывают параметр --result-file
с
Backups\MySQL\MyDatabase_%dt%.sql
вместо
Backups\MySQL\MyDatabase_%dt%\MyDatabase_%dt%.sql
Я предлагаю следующее для командного файла, который избегает повторяющегося кода:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DateTime=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%-%time:~0,2%-%time:~3,2%"
set "DateTime=%DateTime: =0%"
set "DoLocalBackup="
for %%I in (D H G) do if exist "%%I:\Backups\" set "BackupFolder=%%I:\Backups\MySQL\MyDatabase__%DateTime%" & goto MakeBackup
echo ERROR: Failed to find network backup drive.
:LocalBackup
set "BackupFolder=%UserProfile%\Desktop\Backups\MySQL\MyDatabase__%DateTime%"
set "DoLocalBackup=1"
:MakeBackup
mkdir "%BackupFolder%" 2>nul
if exist "%BackupFolder%\" (
C:\xampp\mysql\bin\mysqldump.exe --user=root --password= --host=localhost --port=3306 --result-file="%BackupFolder%\MyDatabase_%DateTime%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
) else (
echo ERROR: Failed to create backup folder: "%BackupFolder%"
)
if not defined DoLocalBackup goto LocalBackup
endlocal
CD /D "%UserProfile%\Desktop\BackupBatchFiles\"
Этот пакетный файл создает резервную копию в первой найденной папке на сетевом диске и дополнительно еще одну резервную копию в подкаталоге каталога рабочего стола текущего пользователя.
Другое решение еще проще, поскольку оно просто выбирает одно из четырех возможных мест резервного копирования в качестве кода кода пакетного файла.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DateTime=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%-%time:~0,2%-%time:~3,2%"
set "DateTime=%DateTime: =0%"
for %%I in (D: H: G: "%UserProfile%\Desktop") do if exist "%%~I\Backups\" set "BackupFolder=%%~I\Backups\MySQL\MyDatabase__%DateTime%" & goto MakeBackup
echo ERROR: Failed to find network backup drive or local backup folder.
goto EndBackup
:MakeBackup
mkdir "%BackupFolder%" 2>nul
if exist "%BackupFolder%\" (
C:\xampp\mysql\bin\mysqldump.exe --user=root --password= --host=localhost --port=3306 --result-file="%BackupFolder%\MyDatabase_%DateTime%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
) else (
echo ERROR: Failed to create backup folder: "%BackupFolder%"
)
:EndBackup
endlocal
CD /D "%UserProfile%\Desktop\BackupBatchFiles\"
Здесь также есть третье решение, которое аналогично второму решению, но продолжает цикл FOR , если не удалось создать папку резервной копии в указанном возможном месте хранения резервной копии.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DateTime=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%-%time:~0,2%-%time:~3,2%"
set "DateTime=%DateTime: =0%"
set "BackupFolder=Backups\MySQL\MyDatabase__%DateTime%"
for %%I in (D: H: G: "%UserProfile%\Desktop") do if exist "%%~I\Backups\" (
mkdir "%%~I\%BackupFolder%" 2>nul
if exist "%%~I\%BackupFolder%\" (
C:\xampp\mysql\bin\mysqldump.exe --user=root --password= --host=localhost --port=3306 --result-file="%%~I\%BackupFolder%\MyDatabase_%DateTime%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
goto EndBackup
) else echo ERROR: Failed to create backup folder: "%%~I\%BackupFolder%"
)
echo ERROR: Failed to find any specified backup folder or to create the
echo current date backup folder in one of the backup folders.
:EndBackup
endlocal
CD /D "%UserProfile%\Desktop\BackupBatchFiles\"
Далее я бы предложил изменить третью строку на:
set "DateTime=%date:~-4,4%-%date:~-7,2%-%date:~-10,2%-%time:~0,2%-%time:~3,2%"
В результате получается международный формат даты YYYY-MM-DD
, который лучше, чем DD-MM-YYYY
, поскольку каталоги / файлы, отсортированные по алфавиту, одновременно сортируются в хронологическом порядке с использованием международного формата даты.
Примечание: Формат даты / времени, используемый для строк даты / времени ссылочных переменных среды DATE
и TIME
, используемых в третьей строке, зависит от того, какая страна / регион настроен для учетной записи, какая используется для запуска этого командного файла. См., Например, % date%, который дает другой результат в пакетном файле при запуске из запланированных задач для решения, не зависящего от региона, для получения текущей даты / времени в указанном формате.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
cd /?
echo /?
endlocal /?
for /?
goto /?
if /?
mkdir /?
или md /?
set /?
setlocal /?