(Я ранее разместил это в комментариях, потому что вопрос был заблокирован. Так как он теперь разблокирован, я отправляю это как ответ)
Язык пакетного сценария не имеет встроенных средств для вычисленияРазница во времени.Эта проблема может быть решена с помощью различных средств, таких как:
- Напишите его, используя другие языки сценариев, такие как VBS, AutoIt, PowerShell и т. Д.
- Загрузите существующую внешнюю программу, такую как Unix
date
утилита от gnuwin32 coreutils ( руководство , рецепт ).Используйте for
, чтобы получить вывод date "+%%s"
в переменную, затем используйте set /a
, чтобы вычислить разницу. - Анализировать вывод из встроенной команды
date
или переменной %date%
.Это обсуждается очень подробно в других местах ( A , B , C , D , E ), нопомните, что на это может повлиять представление времени / даты в локали операционной системы, а также трудно правильно учитывать високосные годы, если вам нужна точность.
Я хотел бы поделиться еще одним приемом: использованиеразница в дате создания файла.Это все еще что-то вроде хака, но, возможно, более переносимо, чем анализ %date%
вручную.
Вот пример, пояснение ниже:
if not exist "c:\some\marker.txt" goto RunTheJob
robocopy /minage:7 "c:\some\marker.txt" "c:\some\test.txt"
if exist "c:\some\test.txt" goto RunTheJob
goto SkipTheJob
:RunTheJob
del /y "c:\some\test.txt"
echo 1 >"c:\some\marker.txt"
rem ... THIS RUNS ONCE IN 7 DAYS ...
:SkipTheJob
Всякий раз, когда мы запускаем работу(т.е. один раз в 7 дней) мы также создаем (или обновляем) файл «маркера» (c:\some\marker.txt
в примере).Содержание и местоположение этого файла не имеют значения, имеет значение только дата его изменения, поэтому я просто пишу в нем символ 1
с echo 1 >YOUR_FILENAME
Это также аккуратно решает проблему хранения информации о дате где-либо.
Теперь, чтобы проверить, прошло ли, по крайней мере, 7 дней с момента последнего запуска задания, вам нужно проверить, не старше ли файла 7 дней.Самый простой способ - использовать утилиту robocopy
- ее параметр /minage:NNN
копирует файл, только если ему не менее NNN дней.
Поэтому мы периодически пытаемся скопировать файл и посмотреть, удастся ли это.Мы делаем это, проверяя, существует ли скопированный файл (c:\some\test.txt
) следующим образом: if exist YOUR_FILENAME goto YOUR_LABEL
Наконец, если файл был скопирован, он больше не нужен, и нам нужно удалить его с помощью del /y YOUR_FILENAME
./y
отменяет подтверждения на всякий случай и, как правило, может быть опущено.
Если файл маркера когда-либо удаляется по какой-либо причине, первая строка в примере гарантирует, что это задание (я предполагаю какое-то резервное копированиеили что-то подобное) запускается сразу.Если бы его там не было, файл никогда не был бы скопирован, потому что оригинал не существовал бы в первую очередь, поэтому задание никогда не запустилось бы в этой ситуации.
Причуды:
Если некоторыеПрограмма обновляет дату модификации файла «маркера», по какой-то причине задание будет отложено.Если это нежелательно, вы должны поместить этот файл в недоступном месте, например, в папку %AppData%\Roaming\YOUR_SCRIPT_NAME
.То же самое может произойти, если файл будет восстановлен из резервной копии.
Чтобы обойти такую проблему, вы можете рассмотреть сжатие файла маркера в архив, такой как zip
, но для этого также требуются внешние программы, VBS илиPowerShell.Возможно, вместо этого можно каким-то образом использовать встроенную утилиту резервного копирования Windows (sdclt
), но я не нашел способа.