Как найти и выбрать новейший файл в каталоге и восстановить с помощью SQLRestore? - PullRequest
0 голосов
/ 27 мая 2018

Я хочу сделать пакетный или cmd-файл для автоматического выбора самого последнего файла в каталоге D:\Romexis_Bilder\romexis_SQL_Backup.Это файлы резервного копирования ZIP SQL, которые создаются два раза в день в формате yymmddhhmm.zip, например, Romexis_db201805271200.zip на сервере под управлением Windows 2016 Server.

Последний добавленный файл в каталог (результат FOR /F) затем следует использовать в SQL RESTORE (резервное копирование и программа ftp Windows).

Идея заключалась в том, чтобы использовать команду FOR

Мой черновик:

  • Перейдите в каталог:

    pushd "D:\Romexis_Bilder\romexis_SQL_Backup"
    
  • Найдите последний файл.(Я действительно не знаю, как установить параметры здесь.)

    for /f "tokens=*" %% in ('dir /D:\Romexis_Bilder\romexis_SQL_Backup /od') do set newest=%%D:\Romexis_Bilder\romexis_SQL_Backup
    
  • Результат FOR должен использоваться в * .zip

    cd C:\Program Files (x86)\Pranas.NET\SQLBackupAndFTP\
    SqlRestore D:\Romexis_Bilder\romexis_SQL_Backup\*.zip -db Romexis_db -srv .\ROMEXIS -pwd password disconnect Romexis_db
    

Я застрял с FOR , но не знаю, возможна ли другая возможность.

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

@ Mofi Спасибо за всю вашу работу, это очень помогло!Как вы посоветовали, я сначала использовал каждую команду в командной строке, чтобы увидеть выходные данные (адаптированный пакет %% I к cmd% I и наоборот)
Теперь я могу найти самый новый файл в D:\Romexis_Bilder\romexis_SQL_Backup результат обработанвзятый в качестве переменной при восстановлении базы данных, который выполняется с помощью One-Click SQL Restore https://sqlbackupandftp.com/restore Я внес некоторые изменения в синтаксис ваших команд O:D, поскольку «-» исключает, удаляет атрибут /TW, поскольку онбыл только список резервных копий с 2017 года.

@echo off
set "BackupFolder=D:\Romexis_Bilder\romexis_SQL_Backup"
for /F "eol=| delims=" %I in ('dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O:D 2^>nul') do set "NewestFile=%I" & goto DatabaseRestore
echo ERROR: Could not find any *.zip backup file in folder:
echo        "%BackupFolder%"
echo/
pause
goto :EOF

:DatabaseRestore
cd /D "%ProgramFiles(x86)%\Pranas.NET\SQLBackupAndFTP"
SqlRestore.exe "%BackupFolder%\%NewestFile%" -db Romexis_db -srv .\ROMEXIS -pwd password 
echo/
pause

Возможно, ^ в 'dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O:D 2^>nul' не является правильным в CMD, но, похоже, не влияет на результат.

Это было действительно заранее!Теперь GUI One-Click SQL Restore открывается с новейшим * zip.Единственное, что мне еще нужно, это синтаксис в командной строке для восстановления, теперь мне все еще нужно нажать на кнопку восстановления в графическом интерфейсе.Или попробуйте это через Microsoft Visual Studio SQL или инструмент командной строки.

0 голосов
/ 10 июня 2018

@ MOFI Не вносятся изменения в файлы с 2017 года или другие файлы вообще, файлы не перезаписываются и не изменяются позже, новый файл всегда создается программой резервного копирования 2 раза в день с именованием romexis_dbYYYMMDDhhmm.zip два разадень.Постараюсь /O-N ОГРОМНОЕ СПАСИБО за ваш ввод

0 голосов
/ 27 мая 2018

Я не знаю, является ли последняя рассматриваемая командная строка действительно правильной.У меня есть некоторые сомнения в выводе этой строки.

Но этот код можно использовать для получения имени новейшего * .zip-файла в соответствии с датой последней модификации без пути.

@echo off
set "BackupFolder=D:\Romexis_Bilder\romexis_SQL_Backup"
for /F "eol=| delims=" %%I in ('dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O-D /TW 2^>nul') do set "NewestFile=%%I" & goto DatabaseRestore
echo ERROR: Could not find any *.zip backup file in folder:
echo        "%BackupFolder%"
echo/
pause
goto :EOF

:DatabaseRestore
cd /D "%ProgramFiles(x86)%\Pranas.NET\SQLBackupAndFTP"
SqlRestore.exe "%BackupFolder%\%NewestFile%" -db Romexis_db -srv .\ROMEXIS -pwd password disconnect Romexis_db
echo/
pause

FOR выполняется в отдельном командном процессе, запущенном с cmd.exe /C в фоновом режиме командной строки:

dir "D:\Romexis_Bilder\romexis_SQL_Backup\*.zip" /A-D-H /B /O-D /TW 2>nul

DIR выводит для обработки STDOUT фонаКомандный процесс

  • только имена не скрытых файлов из-за /A-D-H (атрибут не каталог и не скрытый)
  • в голом формате из-за /B только имя файла с файломрасширение, но без пути к файлу
  • отсортировано в обратном порядке (сначала самое новое) по дате из-за /O-D
  • с использованием времени записи (время последней модификации) из-за /TW
  • в каталоге D:\Romexis_Bilder\romexis_SQL_Backup, соответствующем шаблону Romexis_db*.zip.

Я рекомендую запустить эту командную строку в окне командной строки, чтобы хотя бы раз увидеть, что DIR выводит.

DIR выведет сообщение об ошибкевозраст для обработки STDERR в случае, если * .zip-файл не найден или каталог не существует вообще.Это сообщение об ошибке подавляется путем перенаправления его на устройство NUL .

Прочтите также статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul.Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

FOR захватывает выходные данные, записанные в STDOUT , и обрабатывает выходные данные построчно сигнорирование пустых строк, которых здесь нет, поскольку DIR с параметром /B не выводит пустых строк.

FOR с параметром /F игнорирует запуск строкс точкой с запятой по умолчанию.По этой причине символ конца строки переопределяется с eol=| из ; на вертикальную черту, которую имена файлов не могут содержать.eol=| в этом случае не требуется, поскольку шаблон имени файла Romexis_dbYYYMMDDhhmm.zip делает маловероятным, чтобы имя файла начиналось с точки с запятой.

FOR с параметром /F будет разделятьвверх строк в подстроки, используя пробел / табуляцию в качестве разделителя и назначив для каждой строки только первую строку, разделенную пробелом / табуляцией, для указанной переменной цикла I.Это поведение разделения строки отключается путем указания пустого списка разделителей с delims=.delims= в этом случае не требуется, поскольку шаблон имени файла Romexis_dbYYYMMDDhhmm.zip делает маловероятным, чтобы имя файла содержало символ пробела.

Имя файла, выводимого первым, DIR который является новейшим ZIP-файлом в указанном каталоге, назначен переменной среды NewestFile.И затем цикл FOR завершается с переходом к метке DatabaseRestore, поскольку все другие имена файлов, выводимые DIR , не представляют интереса для этой задачи.

Командные строки под командной строкой FOR выполняются только в том случае, если в указанном каталоге нет файла * .zip, сообщающего об этом случае непредвиденной ошибки.

Можно также использовать * 1101Командная строка * DIR ниже в командном файле из-за шаблона имени файла Romexis_dbYYYMMDDhhmm.zip:

dir "%BackupFolder%\Romexis_db*.zip" /A-D-H /B /O-N 2^>nul

Та же самая командная строка для выполнения из окна командной строки:

dir "D:\Romexis_Bilder\romexis_SQL_Backup\*.zip" /A-D-H /B /O-N 2>nul

Порядок имен файлов в выходных данных здесь обратный по имени, что приводит к печати сначала Romexis_db*.zip с самой новой датой / временем в имени файла благодаря формату даты / времени YYYMMDDhhmm.

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

  • cd /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • pause /?
  • set /?

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...