Расписание задачи: через 6 месяцев

Я пытаюсь найти способ (из пакетного файла), который я могу использовать для создания запланированной задачи, которая будет выполняться через 6 месяцев. Я просмотрел всю сеть, и я наткнулся на AT и SCHTASKS, которые будут планировать задачу ежемесячно.

Я ищу решение, которое будет выполнять эту задачу каждые 6 месяцев.

Я знаю, что это потребует некоторых манипуляций со временем/датой... найти месяц (число месяцев), а затем добавить к нему 6; как только он проходит «12», он возвращается к 1 и т. д. Затем эти числа сопоставляются с названием месяца и используются SCHTASKS или AT для планирования задачи.

Я знаю, как использовать SCHTASKS для планирования задачи из пакетного файла; Мне просто нужен код, чтобы найти месяц, добавить к нему 6, получить название месяца через 6 месяцев и поместить его в переменную, чтобы я мог проанализировать его в SCHTASKS.

Я надеюсь, что все это имеет смысл. Мой английский не так хорош.

ТИА,

Грег


person Greg    schedule 04.10.2010    source источник


Ответы (5)


Спасибо всем, кто ответил, и предложил предложения. Я спал на нем, проснулся с гриппом, и у меня была мозговая волна. Забавно, как все работает. Я знаю, что это излишество, и кто-то предложит лучшее предложение, но все равно..

REM Grab month number and put into variable
  FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
REM Six months from now
  set /a addmm=%mm% + 6
  if %addmm% gtr 6 (set /a sixmonths=%addmm% - 12)
REM Determine month name
  if %sixmonths%==1 (set monthname=JAN)
  if %sixmonths%==2 (set monthname=FEB)
  if %sixmonths%==3 (set monthname=MAR)
  if %sixmonths%==4 (set monthname=APR)
  if %sixmonths%==5 (set monthname=MAY)
  if %sixmonths%==6 (set monthname=JUN)
  if %sixmonths%==7 (set monthname=JUL)
  if %sixmonths%==8 (set monthname=AUG)
  if %sixmonths%==9 (set monthname=SEP)
  if %sixmonths%==10 (set monthname=OCT)
  if %sixmonths%==11 (set monthname=NOV)
  if %sixmonths%==12 (set monthname=DEC)
REM Schedule Task  
  schtasks /create /TN TuneUpReminder /RU system /TR TuneUpReminder.bat /SC MONTHLY /M %monthname%
person Greg    schedule 04.10.2010
comment
Хорошо, я немного запутался с этим. Все работает хорошо, но если эти 6 месяцев идут в течение года, то год не будет в нем учитываться. Так что, если я запланирую это на август, это запланирует его через 6 месяцев, но в текущем году... По какой-то причине он не хочет переходить в новый год, когда я запускаю команду schtasks.. - person Greg; 09.10.2010

Почему бы не использовать планировщик Windows?

Большая часть необходимой вам информации содержится в этой статье: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/schtasks.mspx?mfr=true

Вы можете использовать ежемесячную настройку со значением 6, конечно?

person Dave    schedule 04.10.2010
comment
в Планировщике Windows я могу выбрать месяц, а затем выбрать месяцы, которые я хочу использовать, так что да, я мог бы сделать это таким образом ... но ключом является автоматизация :) Время имеет существенное значение. Спасибо, что нашли время ответить, Дэйв. - person Greg; 04.10.2010
comment
Нет проблем, Грег, я /искренне/ думаю, что это лучший способ решить эту проблему, в моем проекте команда, членом которой я являюсь, полагается исключительно на планировщик Windows для управления задачами в ежедневных, еженедельных, ежемесячных событиях - это было так. долго, что вы можете положиться на 100% уверенность в этом, в то время как мы могли бы попытаться заново изобрести велосипед, это просто не стоит (на мой взгляд!). Также другая сторона этого заключается в том, что перезагрузка/сбой системы и т. д. не повлияют на расписание. Я думаю, возможно, я упускаю из виду причину, по которой это не работает для вас? - person Dave; 04.10.2010
comment
Практически вся моя настройка написана по сценарию (во всяком случае, со стороны программного обеспечения). Я долго и усердно работал над этим и хочу сохранить его таким, если смогу. Спасибо за ваши предложения. - person Greg; 04.10.2010
comment
Сейчас немного не по теме, но почему бы тогда не подумать о написании собственной службы Windows? Это очень просто сделать — вспомогательный класс с логикой для управления запланированной задачей, родительский поток, который спит в течение минуты/часа/дня и выполняет простую проверку (например, IsTimeToRun), которая сравнит DateTime.Now с сохраненная дата? Сделать это на c# (опять же, например) очень просто :) Надеюсь, это пища для размышлений :) (можете дать более подробную информацию, если нужно - я делал это лично несколько раз). - person Dave; 04.10.2010
comment
Это звучит действительно очень сложно, и это далеко от моего понимания. Я пока посплю, думаю. У меня может возникнуть какая-то сумасшедшая идея, и код просто придет мне в голову =) Такие вещи уже случались со мной раньше. - person Greg; 04.10.2010
comment
Нет проблем, Грег, надеюсь, вы найдете хорошее решение этой проблемы, и извините, я больше ничем не могу вам помочь! :) - person Dave; 04.10.2010

Вот сумасшедшая идея: если вам нужен этот скрипт на сервере (который не перезагружен), вы можете написать пакетный файл, который ждет шесть месяцев, а затем выполняет данную программу. Чтобы подождать определенное количество секунд, вы можете злоупотреблять командой «ping», например:

ping -n %SECS% localhost > NUL

Эта команда эффективно приостанавливается на %SECS% секунд, а затем возвращается. Чтобы ждать полгода, просто подождите что-то вроде (365/2)*24*60*60 секунд.

Вот небольшой командный файл, который реализует эту идею:

@echo off
set CMD=echo Half a year elapsed
set /a SECS_IN_HALF_A_YEAR=365 / 2 * 24 * 60 * 60
loop_start:
ping -n %SECS_IN_HALF_A_YEAR% localhost > NUL
%CMD%
goto loop_start

Я не говорю, что это красиво, но я подумал, что это прикольная идея. Может, пища для размышлений. :-)

person Frerich Raabe    schedule 04.10.2010
comment
Первое, что приходит в голову: а как же високосные годы? Кроме того, вам нужно будет добавить это к запуску машины и каким-то образом проверить последнюю среду выполнения (что, если произойдет отключение питания?) - person Dave; 04.10.2010
comment
Это хороший момент, Дэйв.. чтобы было немного понятнее.. это не должно быть ТОЧНО 6 месяцев.. но достаточно близко :) Так что високосные годы не проблема :) Я ИТ-техник, и в основном используя vbs и пакетный скрипт, чтобы запланировать дружеское напоминание для клиента, чтобы он возвращался для настройки каждые 6 месяцев. Таким образом, между простым всплывающим сообщением на экране и дружественным напоминанием по электронной почте его регулярный доход. - person Greg; 04.10.2010
comment
Эта идея сработает, Фрерих. Я буду иметь это в виду, если ни у кого нет лучших предложений. Спасибо, что нашли время, хотя :) Я также думал о команде ping ... но да ... это не самая красивая вещь :) - person Greg; 04.10.2010
comment
Ну, что бы вы ни делали, не оставляйте скрипт, подобный этому, запущенным на клиентской машине, чтобы запланировать дружеское напоминание :) Я бы настроил напоминание/запланированное электронное письмо или подобное в Outlook и вручную связался с клиентом, если это для повторяющегося дохода (легкие деньги!) это стоит личного контакта, конечно? - person Dave; 04.10.2010
comment
Да.. вот почему я против идеи пинга :) Это не сработает, если произойдет отключение :) Потому что время остановится. Я больше ищу способ получить месяц 6 месяцев из знания, проанализировать его в переменной и использовать schtasks для планирования задачи из командной строки. И да, будут рассылаться электронные письма; может быть, даже личные сообщения в социальных сетях. - person Greg; 04.10.2010

вы можете загрузить coreutils для Windows. Затем используйте команду date, как это

C:\test>gnu_date "+%Y%m%d" -d "6 months"
20110404

(он переименован в gnu_date.exe )

Я не играл с schtasks, но в зависимости от того, какой формат даты он использует, вы можете изменить параметры, чтобы они подходили schtasks

C:\test>gnu_date "+%Y-%m-%d" -d "6 months"
2011-04-04

Если вам тоже нужно время

C:\test>gnu_date "+%Y-%m-%d-%H:%M:%S" -d "6 months"
2011-04-04-18:12:35

Используйте цикл for, чтобы сохранить дату в переменной по желанию. затем передайте его schtasks для планирования

person ghostdog74    schedule 04.10.2010
comment
Спасибо, что нашли время внести свой вклад user141527. Это только что дало мне идею .. :) Используя команду даты, цикл for; я должен быть в состоянии получить месяц в переменной. Затем, используя «set/a», я должен иметь возможность добавить 6 (месяцев) к переменной. Но если месячная переменная выше 7 (месяцев), как я могу заставить ее остановиться @ 12 (декабрь) и вернуться к 1 (январь). Оттуда я мог бы использовать простые операторы if, чтобы получить название месяца. И оттуда :) - person Greg; 04.10.2010
comment
Я просто пробовал разные пути со schtasks, используя параметры «/ sc ежемесячно» и «/ mo 6», но, к сожалению, не сработало, как я надеялся, лол. Это бы немного упростило задачу :P - person Greg; 04.10.2010
comment
если вы используете команду даты GNU (а не команду даты Windows), как я описал, вам не нужно будет делать собственный расчет даты. Единственное, что вам нужно сделать, это использовать цикл for, чтобы поместить дату 6 месяцев в переменную, а затем найти способ для schtasks принять эту переменную. - person ghostdog74; 05.10.2010

Поскольку ответ Грега заставил меня плакать внутри, вот некоторый синтаксис, похожий на массив:

for /F "tokens=%sixmonths%" %%A IN ("JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC") DO set monthname=%%A

И поскольку всегда есть несколько способов содрать шкуру с летучей мыши[ch]?

set /a sixmonths=%sixmonths% * 4
set months=666 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
setlocal ENABLEDELAYEDEXPANSION
set monthname=!months:~%sixmonths%,3!
REM Optional: setlocal DISABLEDELAYEDEXPANSION
person Anders    schedule 04.10.2010
comment
Я знал, что есть лучший способ сделать эту часть.. Спасибо за это, Андерс.. xD - person Greg; 06.10.2010