![]() |
Taskplaner: job/task bearbeiten
Ich habe ein kleines Backup Tool gebastelt, welches über einen Task im Taskplaner jede Woche am Freitag um 00:15 gestartet wird
da jedoch die Sicherung auf einem NAS erfolgt welches explizit für den Backup Vorgang eingeschaltet werden muß. Dies geschiet meist am Tag zuvor also in der Regel am Donnerstag. Da es ab und zu vor kommt das ein Feiertag dazwischen kommt, würde ich gern mein Programm soweit erweitern das er nach Abschluß des Backups den nächsten Zeitpunkt ermittelt, in der Regel 7 Tage weiter oder je nach Situation bzw. Feiertag ein anderer Tag. Jetzt meine Frage ist es möglich, wenn ja wie, einen bestehenden Task im Taskplaner zu bearbeiten so das er an einem anderen Tag ausgeführt wird? Evtl. ist es ja möglich die Job Datei selbst zu ändern, habe mir diese noch nicht näher angesehen. |
Re: Taskplaner: job/task bearbeiten
Hallo,
bei JEDI gibt es eine entsprechende Komponente. Das ganze klappt aber nur als Admin. Heiko |
Re: Taskplaner: job/task bearbeiten
Zitat:
|
Re: Taskplaner: job/task bearbeiten
Zitat:
Und das das nur als Administrator klappt ist kein Problem das Backup Tool wird eh im Kontext des Admins ausgeführt. Zitat:
|
Re: Taskplaner: job/task bearbeiten
Ich hatte mir vor einiger Zeit mal die JLC Quellen besorgt, unteranderem befindet sich dort die mstask.pas Datei,
von der ich hier im Forum des öftern gelesen habe. Nur fehlt mir jetzt ein wenig der Ansatz, es geht ja nicht um die erstellung eines neuen Task sondern einen bestehenden zu ändern. Task laden Task ändern (z.B. Ausführungs Tag von Donnerstag auf Mittwoch) Task speichern |
Re: Taskplaner: job/task bearbeiten
Der Code ist zwar zum Löschen eines bestimmten Tasks, aber als Denkanstoß taugt er sicher, da das Prinzip, nach dem Du vorgehen musst, das selbe ist.
Delphi-Quellcode:
procedure DeleteScheduledTask(const aJobName: string);
var TaskScheduler: TJclTaskSchedule; nTask: Integer; begin TaskScheduler := TJclTaskSchedule.Create(); TaskScheduler.Refresh; for nTask := 0 to TaskScheduler.TaskCount - 1 do if (TaskScheduler.Tasks[nTask].TaskName = aJobName + '.job') and (TaskScheduler.Tasks[nTask].Comment = FrmBackup08) then begin with TaskScheduler do begin Delete(nTask); Remove(aJobName + '.job'); Refresh; end; Break; end; TaskScheduler.Free; end; |
Re: Taskplaner: job/task bearbeiten
Ich hatte zwar schon irgendwie einene Teil herraus gefunden, jedoch fehlte mir "TaskScheduler.Refresh" dies sorgt
so wie ich das verstanden habe dafür das man auf den Taskplaner zugreifen kann bzw. man erhält Informationen über die bisherigen Einträge. |
Re: Taskplaner: job/task bearbeiten
Hallo,
in der ![]() Viele Grüße ... |
Re: Taskplaner: job/task bearbeiten
So ich hab das ganze mal ausprobiert aber es will noch nicht so ganz klappen.
Ich hatte hier im forum einen ![]() ich versucht habe einen bestehenden Task zu ändern.
Delphi-Quellcode:
Ich denke es liegt noch an der Stelle wo ich versuche den "Task" bzw. den Trigger zu laden um ihn anschließend zu modifizieren.
procedure TfrmMain.Button1Click(Sender: TObject);
var dtNextRun : TDateTime; bThisWeek : Boolean; dtInfoMsg : TDateTime; TaskScheduler : TJclTaskSchedule; bFound : Boolean; TaskIdx : Integer; piNewTrigger : Word; ppTrigger : ITaskTrigger; pTrigger : _TASK_TRIGGER; myYear : Word; myMonth : Word; myDay : Word; myTriggerTypeUnion : TRIGGER_TYPE_UNION; myWeekly : TWeekly; begin //init bThisWeek := False; //Prüfen ob Datum vor oder nach Freitag liegt if DayOfTheWeek(Now) < DayFriday then bThisWeek := True; //Datum ermitteln an dem Backup durchgeführt werden soll if bThisWeek then dtNextRun := Now + (DayFriday - DayOfTheWeek(Now)) else dtNextRun := Now + (DayFriday - DayOfTheWeek(Now)) + 7; //Prüfen ob die Nächste Ausführung statt finden kann (Feiertag) while fIsHoliday(dtNextRun, NW) do begin dtNextRun := dtNextRun - 1; end;{while} //ShowMessage('Nächste Ausführung am: '+FormatDateTime('ddd dd.mm.yyyy', dtNextRun)); //Tag ermitteln an dem die Benachrichtigung (NAS einschalten) angezeigt werden muß dtInfoMsg := dtNextRun - 1; //Auf Feiertag prüfen while fIsHoliday(dtInfoMsg, NW) do begin dtInfoMsg := dtInfoMsg - 1; end;{while} //ShowMessage('Nachricht: '+FormatDateTime('ddd dd.mm.yyyy', dtInfoMsg)); TaskScheduler := TJclTaskSchedule.Create; TaskScheduler.Refresh; //Task suchen... TaskIdx := 0; bFound := False; while (TaskIdx < TaskScheduler.TaskCount) and not bFound do begin if TaskScheduler.Tasks[TaskIdx].TaskName = 'msg.job' then bFound := True else Inc(TaskIdx); end;{while} //Benachrichtigungs Task 'planen' if bFound then begin with TaskScheduler.Tasks[TaskIdx] do begin ScheduledWorkItem.GetTrigger(piNewTrigger, ppTrigger); DecodeDate(Now, myYear, myMonth, myDay); ZeroMemory(@pTrigger, SizeOf(TASK_TRIGGER)); pTrigger.cbTriggerSize := SizeOf(TASK_TRIGGER); pTrigger.Reserved1 := 0; pTrigger.wBeginYear := myYear; pTrigger.wBeginMonth := myMonth; pTrigger.wBeginDay := myDay; pTrigger.wEndYear := 0; pTrigger.wEndMonth := 0; pTrigger.wEndDay := 0; pTrigger.wStartHour := 15; pTrigger.wStartMinute := 45; pTrigger.MinutesDuration := 0; pTrigger.MinutesInterval := 0; pTrigger.rgFlags := 0; pTrigger.TriggerType := TASK_TIME_TRIGGER_WEEKLY; MyWeekly.WeeksInterval := 1; MyWeekly.rgfDaysOfTheWeek := DayOfWeek(dtInfoMsg); MyTriggerTypeUnion.Weekly := MyWeekly; pTrigger.Type_ := MyTriggerTypeUnion; pTrigger.Reserved2 := 0; pTrigger.wRandomMinutesInterval := 0; ppTrigger.SetTrigger(pTrigger); //An dieser Stelle gibts eine Zugriffsverletztung... Save; end;{with} end;{if} TaskScheduler.Free; end; |
Re: Taskplaner: job/task bearbeiten
So ich habe zwar nicht die Lösung gefunden die ich mir erhoffte, also den
Task/Job zu laden ihn zu ändern und anschließend zu speichern. Jedoch habe ich eine Lösung mit der ich doch ganz gut leben kann :) Ich lösche erst den Trigger um anschließend einen neuen mit den entsprechenden Einstellungen zuerstellen
Delphi-Quellcode:
TaskScheduler := TJclTaskSchedule.Create;
TaskScheduler.Refresh; //Task suchen... TaskIdx := 0; bFound := False; while (TaskIdx < TaskScheduler.TaskCount) and not bFound do begin if AnsiLowerCase(TaskScheduler.Tasks[TaskIdx].TaskName) = 'backup-reminder.job' then bFound := True else Inc(TaskIdx); end;{while} //Benachrichtigungs Task 'planen' if bFound then begin with TaskScheduler.Tasks[TaskIdx] do begin //Bisherigen Plan löschen ScheduledWorkItem.DeleteTrigger(0); //Neuer Trigger setzen... ScheduledWorkItem.CreateTrigger(piNewTrigger, ppTrigger); DecodeDate(Now, myYear, myMonth, myDay); ZeroMemory(@pTrigger, SizeOf(TASK_TRIGGER)); pTrigger.cbTriggerSize := SizeOf(TASK_TRIGGER); pTrigger.Reserved1 := 0; pTrigger.wBeginYear := myYear; pTrigger.wBeginMonth := myMonth; pTrigger.wBeginDay := myDay; pTrigger.wEndYear := 0; pTrigger.wEndMonth := 0; pTrigger.wEndDay := 0; pTrigger.wStartHour := 15; pTrigger.wStartMinute := 45; pTrigger.MinutesDuration := 0; pTrigger.MinutesInterval := 0; pTrigger.rgFlags := 0; pTrigger.TriggerType := TASK_TIME_TRIGGER_WEEKLY; MyWeekly.WeeksInterval := 1; MyWeekly.rgfDaysOfTheWeek := Round(IntPower(2, DayOfWeek(dtInfoMsg)-1)); MyTriggerTypeUnion.Weekly := MyWeekly; pTrigger.Type_ := MyTriggerTypeUnion; pTrigger.Reserved2 := 0; pTrigger.wRandomMinutesInterval := 0; ppTrigger.SetTrigger(pTrigger); Save; end; end;{if} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz