Пакетный файл не записывает результат в нужный каталог? - PullRequest
1 голос
/ 27 апреля 2019

У меня есть следующий на , который очень близок к работе только с одной небольшой проблемой.

Файл результатов .sqlзаписывается вне нужной папки.Пакетный файл правильно создает папку и файл, но не может перейти в нужный каталог при создании файла результата .sql.

Например, он создает D:\Backups\MySQL\MyDatabase__04-27-2018-14-22 и записывает файл MyDatabase__04-27-2018-14-22.sql в папке MySQL, а не внутри папки с точно таким же именем.

Я пробовал варианты изменения каталога безуспешно.

set dt=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%-%time:~0,2%-%time:~3,2%
set dt=%dt: =0%

if exist "D:\Backups\" (mkdir D:\Backups\MySQL\MyDatabase__%dt%
    CD ..
    CD ..
    CD /D D:\Backups\MySQL\MyDatabase__%dt%
    START /WAIT C:\xampp\mysql\bin\mysqldump.exe --user=root --password=  --host=localhost --port=3306 --result-file="D:\Backups\MySQL\MyDatabase_%dt%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
) else if exist "H:\Backups\" (mkdir H:\Backups\MySQL\MyDatabase__%dt%
    CD ..
    CD ..
    H:
    CD H:\Backups\MySQL\MyDatabase__%dt%
    START /WAIT C:\xampp\mysql\bin\mysqldump.exe --user=root --password=  --host=localhost --port=3306 --result-file="H:\Backups\MySQL\MyDatabase_%dt%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
) else if exist "G:\Backups\" (mkdir G:\Backups\MySQL\MyDatabase__%dt%
    CD ..
    CD ..
    G:
    CD G:\Backups\MySQL\MyDatabase__%dt%
    START /WAIT C:\xampp\mysql\bin\mysqldump.exe --user=root --password=  --host=localhost --port=3306 --result-file="G:\Backups\MySQL\MyDatabase_%dt%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
) else mkdir C:\Users\Scotty\Desktop\Backups\MySQL\MyDatabase__%dt%
CD ..
CD ..
C:
CD C:\Users\Scotty\Desktop\Backups\MySQL\MyDatabase__%dt%
START /WAIT C:\xampp\mysql\bin\mysqldump.exe --user=root --password=  --host=localhost --port=3306 --result-file="C:\Backups\MySQL\MyDatabase_%dt%.sql" --default-character-set=utf8 --single-transaction=TRUE --databases "MyDatabase"
CD..
CD..
CD C:\Users\Scotty\Desktop\BackupBatchFiles\

Фактический результатявляется то, что файл результата находится вне каталога, созданного с тем же именем.Я ожидаю, что файл результата .sql будет записан ВНУТРИ каталога, в котором создан пакетный файл с тем же именем.

1 Ответ

1 голос
/ 28 апреля 2019

Ну, все строки с 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 /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...