Получить разницу между текущей датой и предыдущей датой - PullRequest
0 голосов
/ 21 ноября 2018

Если я введу echo %date% в cmd, я получу дату сегодня.Давайте скажем, что сегодня Wednesday, 21/11/2018.Если я наберу echo %date% cmd напечатает Wed 11/21/2018.Вчера вернулось бы Tue 11/20/2018.Разница между этими двумя датами (в днях) составляет 1.

Можно ли как-нибудь вычитать это в командной строке?Что-то вроде:

set previous_date=Tue 11/20/2018
echo %date% - %previous_date%

Я знаю, что это должно быть очень легко сделать на языке программирования, таком как python или VBScript, но я не хочу использовать ни один из них, если это не абсолютнонеобходимо.Я могу загрузить и использовать пользовательские инструменты командной строки, но я хочу сделать это с помощью командного файла.

Кто-нибудь, кто знает, как?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

В одном из ваших комментариев вы говорите:

В моей папке автозагрузки есть файл bat, который запускает процесс раз в неделю.Это делается путем проверки текущего дня и запуска процесса в понедельник, если% date: ~ 0,1% == M ().Проблема в том, что мне нужно, чтобы этот процесс запускался по крайней мере раз в 7 дней.Но если, скажем, я забыл открыть свой ноутбук в определенный понедельник, это не запустит процесс до следующего понедельника.Так что теперь я просто хочу изменить логику запуска процесса, если он не был запущен в течение как минимум 7 дней

Это то, для чего создан TaskScheduler.Нет необходимости связываться с вычислениями даты или даже с зависимыми от языка форматами %date%.

Запустить TaskScheduler
«Создать задачу» (не «Создать основную задачу»)
в «Триггерах», установленном на«Еженедельно», «Повторять каждые 1 недели по: Monday
в« Настройках », отметьте« Выполнить задание как можно скорее после пропуска запланированного запуска »
Заполните также« Общие »,« Действия »Вкладки "и" Условия "для ваших нужд.

0 голосов
/ 23 ноября 2018

(Я ранее разместил это в комментариях, потому что вопрос был заблокирован. Так как он теперь разблокирован, я отправляю это как ответ)

Язык пакетного сценария не имеет встроенных средств для вычисленияРазница во времени.Эта проблема может быть решена с помощью различных средств, таких как:

  • Напишите его, используя другие языки сценариев, такие как 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), но я не нашел способа.

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