В обоих сценариях есть несколько ошибок.
Рекомендую сначала прочитать Как задать переменные среды с пробелами? и Почему нет строкового вывода с '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 /?