AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Taskplaner: job/task bearbeiten

Ein Thema von TUX_der_Pinguin · begonnen am 27. Apr 2009 · letzter Beitrag vom 29. Apr 2009
Antwort Antwort
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Taskplaner: job/task bearbeiten

  Alt 27. Apr 2009, 14:02
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Taskplaner: job/task bearbeiten

  Alt 27. Apr 2009, 14:08
Hallo,

bei JEDI gibt es eine entsprechende Komponente.

Das ganze klappt aber nur als Admin.



Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Taskplaner: job/task bearbeiten

  Alt 27. Apr 2009, 14:21
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\.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Taskplaner: job/task bearbeiten

  Alt 27. Apr 2009, 14:25
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 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.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Taskplaner: job/task bearbeiten

  Alt 28. Apr 2009, 07:31
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
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Taskplaner: job/task bearbeiten

  Alt 28. Apr 2009, 07:42
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;
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Taskplaner: job/task bearbeiten

  Alt 28. Apr 2009, 07:53
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.
  Mit Zitat antworten Zitat
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Taskplaner: job/task bearbeiten

  Alt 28. Apr 2009, 08:06
Hallo,

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

Viele Grüße ...

  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Taskplaner: job/task bearbeiten

  Alt 28. Apr 2009, 09:10
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.jobthen 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.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Taskplaner: job/task bearbeiten

  Alt 29. Apr 2009, 09:14
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.jobthen 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}
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz