Резервный скрипт - найти файл по шаблону, прочитать его полное имя и перейти к скрипту - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь использовать 7-Zip для целей резервного копирования.
Я уже написал скрипт для полного резервного копирования:

@echo off
set source="c:\Source"
set destination="C:\Dest"
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%dd%-%mm%-%yyyy%
"C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx6 -r0 %destination%\Full_%curdate%.zip %source%

Новый скрипт, предназначенный для инкрементного резервного копированиязапускается после полного резервного копирования.Но я не совсем понимаю, как заставить мой второй скрипт читать файлы из каталога и искать файл, начинающийся с full_xx_xx_xxxx.zip, назначать имя файла переменной и затем передавать его в скрипт для инкрементного резервного копирования.

Я попробовал скрипт ниже, но он не работает:

@echo off
set source="c:\Source"
set destination="c:\Dest"
set exten="Full_*.zip"
set passwd="NAS"
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%dd%-%mm%-%yyyy%
for %%a in %exten do echo %%a
"C:\Program Files\7-Zip\7z.exe" u -tzip -ssw -r0 %destination%\%%a.zip -u- -up0q3x2z0!"%destination%\diff_%date%.zip" %source%

1 Ответ

0 голосов
/ 25 декабря 2018

В обоих сценариях есть несколько ошибок.

Рекомендую сначала прочитать Как задать переменные среды с пробелами? и Почему нет строкового вывода с 'echo% var%'после использования' set var = text 'в командной строке? .Синтаксис set variable="value in quotes" часто не годится, поскольку он присваивает строке "value in quotes" с двойные кавычки и все конечные пробелы / табуляции, которые могут также существовать в пакетном файле, переменной среды с именем variable.Этот синтаксис проблематичен при конкатенации строкового значения переменной среды с другими строками, как это сделано в размещенном коде с %destination%, поскольку " теперь находится где-то посередине конечной строки аргумента вместо того, чтобы заключать всю строку аргумента.Лучше синтаксис set "variable=value without or with spaces" с " слева от имени переменной, поскольку двойные кавычки теперь интерпретируются как разделители строк аргументов, и, возможно, существующие пробелы / табуляции в строке после второй " игнорируются командным процессором Windows.

Использование динамической переменной среды DATE позволяет быстро получить текущую локаль дату в формате, пригодном для имен файлов / папок.Но необходимо учитывать, что формат даты значения DATE зависит от региона / страны / языкового стандарта, установленного для учетной записи пользователя, которая используется для запуска пакетного файла.Я предполагаю, что echo %DATE% приводит к выводу даты в формате DD.MM.YYYY, и поэтому командные строки, использующие DATE, подходят для вашей учетной записи пользователя в соответствии с настроенной страной.

* 1028Командная строка * FOR полностью неверна и приводит к завершению выполнения пакетного файла с выводом сообщения об ошибке с помощью cmd.exe, интерпретируя пакетный файл построчно.Эта ошибка выводится при запуске командного файла из окна командной строки вместо двойного щелчка по командному файлу.См. отладка пакетного файла для получения подробной информации о том, как отладить пакетный файл, чтобы найти синтаксические ошибки, подобные этой, о которых сообщает командный процессор Windows во время выполнения пакетного файла.

Поэтому я предлагаю для первогопакетный файл:

@echo off
set "Source=C:\Source"
set "Destination=C:\Dest"
set "CurrentDate=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%"
"%ProgramFiles%\7-Zip\7z.exe" a -tzip -ssw -mx6 -r0 "%Destination%\Full_%CurrentDate%.zip" "%Source%"

Текущая локаль дата присваивается переменной среды CurrentDate в формате YYYY-MM-DD вместо DD-MM-YYYY.Формат даты YYYY-MM-DD является международным форматом даты в соответствии с ISO 8601. Он имеет одно большое преимущество по сравнению со всеми языковыми форматами даты в именах файлов: имена файлов с датой в формате YYYY-MM-DD, отсортированные по алфавитукак обычно в то же время отсортированы хронологические.Это значительно облегчает людям и сценариям поиск определенного файла в списке имен файлов с датой в имени файла.

Я не совсем уверен, что вы хотите сделать со вторым пакетным файлом.Поэтому я могу только предположить, что вы хотите сделать, и предложить для второго пакетного файла:

@echo off
set "Source=C:\Source"
set "Destination=C:\Dest"
set "CurrentDate=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%"
set "NamePattern=Full_*.zip"
for /F "skip=1 eol=| delims=" %%I in ('dir "%Destination%\%NamePattern%" /A-D /B /O-N 2^>nul') do (
    "%ProgramFiles%\7-Zip\7z.exe" u -tzip -ssw -r0 "%Destination%\%%I" -u- -up0q3x2z0!"%Destination%\Diff_%CurrentDate%.zip" "%Source%"
    goto Done
)
:Done

Цикл FOR запускает команду DIR в отдельном командном процессезапустился в фоновом режиме, чтобы получить список Full_*.zip имен файлов в целевом каталоге, отсортированный по имени в обратном порядке, что означает, что полный резервный ZIP-файл, созданный сегодня, с первым пакетным файлом, находится сверху, с использованием формата даты YYYY-MM-DD и ранее созданного ZIP-файласо вчерашнего дня (или всякий раз, когда последний, но один полный ZIP-файл был создан) выводится во второй строке.

FOR пропускает первую строку с именем файла ZIP с текущей датой и запускает 7-Zip с ранее созданным ZIP-файлом (вчера) для создания разностного ZIP-файла.Затем цикл FOR завершается без обработки всех остальных полных ZIP-файлов с переходом к метке под циклом FOR .

Оба пакетных файла вместе:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Source=C:\Source"
set "Destination=C:\Dest"
set "CurrentDate=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%"
set "NamePattern=Full_*.zip"
rem Create full ZIP backup.
"%ProgramFiles%\7-Zip\7z.exe" a -tzip -ssw -mx6 -r0 "%Destination%\Full_%CurrentDate%.zip" "%Source%"
rem Create difference ZIP backup with files added/changed in source directory
rem in comparison to the files compressed into last but on full ZIP backup.
for /F "skip=1 eol=| delims=" %%I in ('dir "%Destination%\%NamePattern%" /A-D /B /O-N 2^>nul') do (
    "%ProgramFiles%\7-Zip\7z.exe" u -tzip -ssw -r0 "%Destination%\%%I" -u- -up0q3x2z0!"%Destination%\Diff_%CurrentDate%.zip" "%Source%"
    goto Done
)
:Done
endlocal

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

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...