Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Taskplaner: job/task bearbeiten (https://www.delphipraxis.net/133184-taskplaner-job-task-bearbeiten.html)

TUX_der_Pinguin 27. Apr 2009 14:02


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.

hoika 27. Apr 2009 14:08

Re: Taskplaner: job/task bearbeiten
 
Hallo,

bei JEDI gibt es eine entsprechende Komponente.

Das ganze klappt aber nur als Admin.



Heiko

nicodex 27. Apr 2009 14:21

Re: Taskplaner: job/task bearbeiten
 
Zitat:

Zitat von TUX_der_Pinguin
Evtl. ist es ja möglich die Job Datei selbst zu ändern, habe mir diese noch nicht näher angesehen.

Wenn der geplante Task über das 2.0-er Interface angesprochen wird (Vista), oder in das neue Format konvertiert wird, dann gibt es keine *.job mehr in %WinDir%\Tasks\.

TUX_der_Pinguin 27. Apr 2009 14:25

Re: Taskplaner: job/task bearbeiten
 
Zitat:

Zitat von hoika
Hallo,

bei JEDI gibt es eine entsprechende Komponente.

Das ganze klappt aber nur als Admin.

Hmm ich hatte gehofft ich kann das ohne Komponente machen, muß ich mal schauen hab bisher nie großartig mit JEDI gearbeitet.
Und das das nur als Administrator klappt ist kein Problem das Backup Tool wird eh im Kontext des Admins ausgeführt.


Zitat:

Zitat von nicodex
Wenn der geplante Task über das 2.0-er Interface angesprochen wird (Vista), oder in das neue Format konvertiert wird, dann gibt es keine *.job mehr in %WinDir%\Tasks\.

Ich hatte vergessen zu erwähnen das das unter Windows 2003 Server läuft.

TUX_der_Pinguin 28. Apr 2009 07:31

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

HeikoAdams 28. Apr 2009 07:42

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;

TUX_der_Pinguin 28. Apr 2009 07:53

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.

Grolle 28. Apr 2009 08:06

Re: Taskplaner: job/task bearbeiten
 
Hallo,

in der Toolbox 2/2008 war auch ein größerer Artikel mit Komponente zum Thema.

Viele Grüße ...

TUX_der_Pinguin 28. Apr 2009 09:10

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 Beitrag entdeckt mit dessen hilfe
ich versucht habe einen bestehenden Task zu ändern.

Delphi-Quellcode:
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;
Ich denke es liegt noch an der Stelle wo ich versuche den "Task" bzw. den Trigger zu laden um ihn anschließend zu modifizieren.

TUX_der_Pinguin 29. Apr 2009 09:14

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