[GastForen Programmierung/Entwicklung AppleScript Zeitmessung mit Ordneraktion

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

13. Jun 2005, 09:19
Beitrag # 1 von 19
Bewertung:
(4544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
ich möchte per Skript folgendes realisieren, weiss aber nicht genau wie, da ich noch Anfänger bin was Apple Script angeht.

Also, geplant ist eine Ordnerüberwachung, das heisst ich möchte feststellen wie lange ein Ordner geöffnet war.

Ich hab mir gedacht, vielleicht ist es möglich die abgelaufenen Sekunden mit Textedit in eine txt Datei zuschreiben wenn der Ordner geschlossen wird. Wird der Ordner geöffnet wird zuerst die vorher in die textdatei geschriebene Sekundenzahl in eine Variable übernommen und wenn der Ordner wieder geschlossen wird, werden die vorherigen Sekunden mit den aktuellen addiert und der die neue Sekundenzahl wird in die txt Datei gespeichert.

Vielleicht kann man das sogar so machen, das das ganze gleich in Stunden:Minuten:Sekunden angezeigt wird und das die Textdatei sobenannt wird wie der aktuelle Ordner heisst.

Ich hoffe das ist nciht allzu wirr erklärt und ich hoffe das mir hierbei jemand helfen kann.

Danke im voraus und Grüsse aus München
Mike

P.S.: Mein Skript sieht dis jetzt so aus:

[code:1]property OpenZeit : 0
property CloseZeit : 0

on opening folder this_folder
 set OpenZeit to time of (current date)
end opening folder

on closing folder window for this_folder
 set CloseZeit to time of (current date)
 set Ablauf to CloseZeit + OpenZeit
 set OpenZeit to 0
 set CloseZeit to 0
 display dialog "Der Ordner war " & Ablauf & " Sekunden geöffnet."
 
 open for access file this_folder & "zeit.txt" with write permission
 set RefNum to (open for access file this_folder & "zeit.txt" with write permission)
 try
  write "Aufgelaufene Arbeitszeit:" & return & "Stunden:Minuten:Sekunden" to RefNum
  write Ablauf to RefNum
  close access RefNum
 on error
  close access RefNum
 end try
 
 
end closing folder window for [/code:1]

X

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2005, 12:27
Beitrag # 2 von 19
Beitrag ID: #419736
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

willkommen im dtpro-Forum! :-)

Ich nehme mal an, dass Du das Script für Mac OS X entwickeln willst. Panther? Tiger?

Deine Aufgabenstellung hört sich anfangs recht einfach an. Aber beim Ausprobieren Deines Scripts
hast Du sicher bemerkt, dass das Ergebnis nicht stimmen kann und dass es nicht so leicht ist.

So wie ich es beurteile, hilft es nichts, die Variable 'OpenZeit' als 'property' zu definieren, denn
sie wird im 'closing'-Handler nicht erkannt (unter Panther). Die Lösung ist also, die Öffnungszeit
gleich in die Datei zu schreiben, damit der Wert gespeichert ist.

Wenn der Ordner geschlossen wird, stoppt das Script zuerst die Zeit, liest dann diese gespeicherte
Datei in eine Variable, wandelt den ersten Absatz in eine Zahl um, rechnet die Differenz aus und
zeigt den Dialog an.
---
on opening folder this_folder
   set logFile to (this_folder as string) & "zeit.txt"
   set OpenZeit to (time of (current date) as string)
   open for access file logFile with write permission
   try
      write OpenZeit to file logFile
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end opening folder

on closing folder window for this_folder
   set CloseZeit to time of (current date)
   set aStr to read file ((this_folder as string) & "zeit.txt")
   set OpenZeit to (paragraph 1 of aStr) as integer
   set Ablauf to CloseZeit - OpenZeit
   display dialog "Der Ordner war " & Ablauf & " Sekunden geöffnet."
end closing folder window for

---
Ja, ich weiss: Das entspricht bei weitem nicht Deinen Vorgaben. Aber jetzt klappt es mit der Zeitansage.
Übrigens, kann der Ordner beliebig oft geöffnet und geschlossen werden. Im Moment wird der gespeicherte Wert
bei jedem Öffnen überschrieben.

Einer Deiner Wünsche ist, die Uhrzeit (= 'time string') zu notieren statt sie in Sekunden (= 'time') anzugeben.
In beiden Fällen muss die Textkette in der gespeicherten Datei zum Rechnen in Zahlen verwandelt werden. Und
wenn Stunden, Minuten und Sekunden zu berücksichtigen sind, ist es komplizierter, als mit den Sekunden alleine.

Doch habe ich schon mal ein ähnliches Script geschrieben. Näheres findest Du im Thema "Auftragserfassung per Script"
http://www.page-online.de/page/forum/viewthread/2492

Damals ging es um ein Droplet. Ich werde also versuchen, jenes Script in ein Ordneraktionsscript zu verwandeln.
Ich werde mich wieder melden.

Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

13. Jun 2005, 12:49
Beitrag # 3 von 19
Beitrag ID: #419737
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
erstmal danke für deine Hilfe.

Jezt funzt das mit den sekunden perfekt, aber in der Textdatei stehen jetzt nicht die Sekunden drin sondern bei z.B. einer Sekunde Öffnungszeit sthe da: 45914.

Wie krig ich es hin das da die richtigen Seunden stehen und wie kompliziert ist es das ganze in Std:Min:Sek darzustellen und jedesmal neu dazu zu addieren??


P.S.:
Ich habe mir das Droplet auf das du verwiesen hast angesehen und es ist für mich nahezu perket, allerdings gehts ja bei mir nicht um einzelne Dateien sondern um die gesamt Zeit die der Ordner offen war, aber ich bin mir sicher du kriegst das hin. :)

Noch ne Frage hab ich zu meinem Skript:
Wäre es theoretischmöglich zu protokollieren mit welchen Programmen die Zeiten für den jeweiligen ordner verursacht wurden ???


Gruss Mike


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2005, 13:41
Beitrag # 4 von 19
Beitrag ID: #419738
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

bitteschön!

Also ... die Zahl, welche Du in der Textdatei findest, ist die gestoppte Zeit bei der Öffnung des
Ordners. Nicht die Dauer der Offenhaltens, sondern der Zeitpunkt. Und zwar im Format 'time of (current date)'.
Deine 45914 bedeuten 12:45:14 oder (12 x 3600) + (45 x 60) + 14 = 45914.

Damit die Uhrzeit im Format hh:mm:ss in die Datei geschrieben wird, muss man den 'time string' verlangen.
Aber dann wird (wie schon erwähnt) das Rechnen damit schwieriger. Denn dann wird statt 45914
12:45:14 in die Datei gegeben. Beim Einlesen kann die erste Zahl mit '(paragraph 1 of aStr) as integer'
leicht in eine Zahl verwandelt werden. Aber beim 'time string' müssen die drei Elemente umgerechnet werden.

Ein Beispiel. Zuerst wird der Variablen 'OpenZeit' der 'time string' der aktuellen Zeit zugewiesen. Der Befehl 'delay 2'
verzögert den Ablauf um zwei Sekunden. Dann wird die Zeit für 'CloseZeit' gestoppt. Beide Resultate müssen dem
Handler 'convToSecs' zum Umrechnen in Sekunden übergeben werden. Und dann kann man mit den Werten
rechnen und der Variablen 'Ablauf' die Differenz zuweisen.
---
set OpenZeit to time string of (current date)
delay 2
set CloseZeit to time string of (current date)

set OpenSecs to convToSecs(OpenZeit)
set CloseSecs to convToSecs(CloseZeit)
set Ablauf to (CloseSecs - OpenSecs)

on convToSecs(timeStr)
   set nSecs to 0
   set AppleScript's text item delimiters to {":"}
   set nSecs to nSecs + ((text item 1 of timeStr) as integer) * 3600
   set nSecs to nSecs + ((text item 2 of timeStr) as integer) * 60
   set nSecs to nSecs + ((text item 3 of timeStr) as integer)
   set AppleScript's text item delimiters to {""}
   return nSecs
end convToSecs

---
Doch zum Schreiben in ein Logfile würde ich es vorziehen, das ganze Datum zu notieren, so wie es im obenerwähnten
Thema gemacht wird. Sonst hat man nur die Zeitangaben, aber weiss nicht an welchem Tag die Aktion geschehen ist.

Ja, das erwähnte Droplet sollte nur zeigen, wie komplex die Sache wird, wenn man die gestoppten Zeiten in eine Datei
schreibt und aus dieser dann den letzten Wert herausliest.

Und nein, ich glaube nicht, dass es möglich ist, auch das Programm festzustellen, mit welchem gearbeitet wurde,
währenddem der Ordner geöffnet war.

Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

13. Jun 2005, 13:52
Beitrag # 5 von 19
Beitrag ID: #419739
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
danke für die ausführliche Erklärung.

Das mit den programmen ist nicht so wichtig und war nur mal so ne Überlegung. Mir wäre echt geholfen wenn du das Droplet so hinbekommen würdest, das ich es als Zeitmessung für Ordneraktionen benutzen kann.

Und wenn das Logfile so aussieht wie in dem Beispiel, dann bin ich volll happy.

Also mach einfach so wie du es für richtig hälst und noch mal danke für deine grossartige Hilfe.

Gruss Mike


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2005, 14:49
Beitrag # 6 von 19
Beitrag ID: #419740
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

ich werde voraussichtlich erst heute Abend damit beginnen können. Und weil das Umbauen des Codes
nicht so einfach sein wird, möchte ich gerne wissen, ob jedes Öffnen und Schliessen ins Logfile
geschrieben und die Dauer zum Gesamt-Total aller "Öffnungszeiten" addiert werden soll. Etwa so:
[code:1]Beginn: Montag, 13. Juni 2005 15:23:19 Uhr
Ende:   Montag, 13. Juni 2005 15:35:21 Uhr
Dauer:  00:12:02

Beginn: Montag, 13. Juni 2005 16:08:23 Uhr
Ende:   Montag, 13. Juni 2005 16:16:38 Uhr
Dauer:  00:08:15

Total:  00:20:27[/code:1]
Oder soll der Eintrag immer wieder überschrieben werden? (Wie ich es in einem anderen Thread 
glaube verstanden zu haben ;-)

Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

13. Jun 2005, 14:58
Beitrag # 7 von 19
Beitrag ID: #419741
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
also so wärs natürlich perfekt:

[code:1]
Beginn: Montag, 13. Juni 2005 15:23:19 Uhr
Ende:  Montag, 13. Juni 2005 15:35:21 Uhr
Dauer:  00:12:02

Beginn: Montag, 13. Juni 2005 16:08:23 Uhr
Ende:  Montag, 13. Juni 2005 16:16:38 Uhr
Dauer:  00:08:15

Total:  00:20:27[/code:1]

Danke, Danke, Danke und Gruss aus München
Mike



als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2005, 21:21
Beitrag # 8 von 19
Beitrag ID: #419742
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

und hier ist meine Lösung. Der reine Code, ohne jeden Kommentar, weil er schon umfangreich genug ist.
Wenn etwas davon nicht klar sein sollte, dann werde ich Deine Fragen gerne beantworten.
---
on opening folder this_folder
   set openTime to current date
   tell application "Finder" to set folName to name of this_folder
   set logFile to (this_folder as string) & folName & ".txt"
   try
      alias logFile
      set curString to readCur(logFile)
      set nPara to count of paragraphs of curString
      if nPara = 5 then
         writeBegin1(logFile, openTime)
      else if nPara > 6 then
         if nPara mod 2 = 1 then
            writeBegin2(logFile, curString, openTime)
         end if
      end if
   on error
      writeBegin1(logFile, openTime)
   end try
end opening folder

on closing folder window for this_folder
   set closeTime to current date
   tell application "Finder" to set folName to name of this_folder
   set logFile to (this_folder as string) & folName & ".txt"
   try
      set curString to readCur(logFile)
      set nPara to count of paragraphs of curString
      if nPara = 2 then
         writeEnd1(logFile, curString, closeTime)
      else if nPara = 6 then
         writeEnd1(logFile, curString, closeTime)
         set curString to readCur(logFile)
         writeTotal(logFile, curString)
      else if nPara > 6 then
         if nPara mod 2 = 0 then
            writeEnd2(logFile, curString, closeTime)
            set curString to readCur(logFile)
            writeTotal(logFile, curString)
         end if
      end if
   end try
end closing folder window for

on readCur(logFile)
   set curString to read file logFile
   return curString
end readCur

on writeBegin1(logFile, openTime)
   set aString to "Beginn: " & openTime & return
   try
      open for access file logFile with write permission
      write aString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeBegin1

on writeBegin2(logFile, curString, openTime)
   set aString to text 1 thru -17 of curString as string
   set newString to aString & "Beginn: " & openTime & return
   try
      open for access file logFile with write permission
      set eof of file logFile to 0
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeBegin2

on writeEnd1(logFile, curString, closeTime)
   set oldTime to date (text 9 thru -1 of paragraph -2 of curString)
   if oldTime > closeTime then set oldTime to oldTime - 12 * hours
   set nSecs to closeTime - oldTime
   set diffTime to convToTime(nSecs)
   set newString to "Ende:   " & closeTime & return & "Dauer:  " & diffTime & return & return
   try
      open for access file logFile with write permission
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeEnd1

on writeEnd2(logFile, curString, closeTime)
   set oldTime to date (text 9 thru -1 of paragraph -2 of curString)
   if oldTime > closeTime then set oldTime to oldTime - 12 * hours
   set nSecs to closeTime - oldTime
   set diffTime to convToTime(nSecs)
   set newString to "Ende:   " & closeTime & return & "Dauer:  " & diffTime & return & return
   try
      open for access file logFile with write permission
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeEnd2

on writeTotal(logFile, curString)
   set nPara to count of paragraphs of curString
   set nSecs to 0
   repeat with i from 3 to nPara by 4
      set timeStr to (text 8 thru -1 of paragraph i of curString)
      set nSecs to convToSecs(nSecs, timeStr)
   end repeat
   set totTime to convToTime(nSecs)
   set newString to "Total:  " & totTime
   try
      open for access file logFile with write permission
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeTotal

on convToSecs(nSecs, timeStr)
   set AppleScript's text item delimiters to {":"}
   set nSecs to nSecs + ((text item 1 of timeStr) as integer) * 3600
   set nSecs to nSecs + ((text item 2 of timeStr) as integer) * 60
   set nSecs to nSecs + ((text item 3 of timeStr) as integer)
   set AppleScript's text item delimiters to {""}
   return nSecs
end convToSecs

on convToTime(nSecs)
   set difH to text -2 thru -1 of ("0" & (nSecs div 3600))
   set restSecs to nSecs mod 3600
   set difM to text -2 thru -1 of ("0" & (restSecs div 60))
   set difS to text -2 thru -1 of ("0" & (restSecs mod 60))
   return difH & ":" & difM & ":" & difS
end convToTime

---
Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

14. Jun 2005, 08:48
Beitrag # 9 von 19
Beitrag ID: #419743
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo hans,
also erstmal 1000 Dank, das Script ist der Hammer, einfach perfekt.

Aber ne Frage hab ich noch, wie lange muss ich warten bis ich es deaktivieren kann um, den Ordner zu öffnen und die txt Datei auszudrucken ??

Denn wenn ich jetzt den Ordner ein paarmal öffne und schliesse und anschliessend das script deaktiviere.

Dann steht in der txt Datei folgendes:

[code:1]Beginn: Dienstag, 14. Juni 2005 8:42:01 Uhr
Ende: Dienstag, 14. Juni 2005 8:42:03 Uhr
Dauer: 00:00:02

Beginn: Dienstag, 14. Juni 2005 8:42:05 Uhr
Ende: Dienstag, 14. Juni 2005 8:42:08 Uhr
Dauer: 00:00:03
Beginn: Dienstag, 14. Juni 2005 8:42:12 Uhr[/code:1]

Frage ist also, wie kann ich das txt File ausdrucken, so das immer die Totalzeit druntersteht. Denn wenn ich die txt Datei öffne wenn das Script läuft steht ja die Total zeit noch nicht drin.

Aber wie gesagt danke für deine Hilfe, das Script ist super.

Grüsse Mike



als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

14. Jun 2005, 09:51
Beitrag # 10 von 19
Beitrag ID: #419744
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

bitteschön. :-)

Das Script muss nicht deaktiviert werden. Aber es kann natürlich nicht wissen, ob Du den Ordner öffnest,
um zu arbeiten oder "nur", um die Textdatei auszudrucken.

Aber wenn Du auf Listendarstellung (oder, noch besser: Kolonnendarstellung) umschaltest, dann kommst
Du an das File, ohne dass eine neue Beginnzeit eingetragen wird. Und am Schluss ist das Total zu sehen.

Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

14. Jun 2005, 10:02
Beitrag # 11 von 19
Beitrag ID: #419745
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
super das passt so.....ich bin echt begeistert.

Aber ich hätte da noch ne Frage bzw. Bitte, aber nur wenns machbar ist.

Kann man das ganze so machen, das wenn ich über das Netzwerk den gleichen Ordner öffne das Script merkt das schon ne txt Datei vorhanden ist und eine 2 txt Datei anlget mit Ordnernamen und ner fortlaufenden Nummer dahinter ??? Ich lass das Script natürlich dann auch paralell dazu auf dem anderen Mac laufen.

Und das andere Problem ist: Kann das Script irgendwie merken, dass die Maus seit z.B. 5min inaktiv ist und den Ordner automatisch schliessen??

Ich hoffe das ist jetzt nicht zu unverschämt und du könntest das noch ändern oder hinzufügen. Wenn du willst könnt ich das sogar bezahlen.

Grüsse und Danke
Mike


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

14. Jun 2005, 10:25
Beitrag # 12 von 19
Beitrag ID: #419746
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

bitteschön. :-)

Leider muss ich Deine Begeisterung dämpfen. Ich glaube nicht, dass
eine so totale Überwachung mit reinem AppleScript machbar ist.

Nicht einmal der erste Punkt. Denn das Script ist auf die Maschine
fixiert, von welcher die Ordneraktion angefügt worden ist. Und
deshalb würde die Frage nach dem Users nicht immer stimmen.

Vielleicht könnte man es so lösen, dass beim Öffnen des Ordners
ein Dialog gezeigt wird, in welchem sich der Benutzer "einloggen"
muss. Ich werde mal etwas herumpröbeln.

Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Anonym
Beiträge gesamt: 22827

14. Jun 2005, 13:52
Beitrag # 13 von 19
Beitrag ID: #419747
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
jetzt habe ich doch noch ein Pobelm festgestellt.

Nach dem zweiten mal Ordner öffnen schreibt das Script immer:

[code:1]Beginn: Dienstag, 14. Juni 2005 13:46:47 Uhr
Ende: Dienstag, 14. Juni 2005 13:46:59 Uhr
Dauer: 00:00:12

Beginn: Dienstag, 14. Juni 2005 13:47:11 Uhr
Ende: Dienstag, 14. Juni 2005 13:47:22 Uhr
Dauer: 00:00:11
Beginn: Dienstag, 14. Juni 20Beginn: Dienstag, 14. Juni 20Beginn: Dienstag, 14. Juni 2005 13:49:01 Uhr[/code:1]

es schreibt also keine Endzeit mehr und rechnet auch nicht mehr zusammen. Habe keine Ahnung warum. Zweimal funzts perfekt und nach jedem weiteren öffen des Ordners schreibt er nur noch den Beginn.

Vielleicht, (ich bin mir sicher) hast du ne Lösung dafür.

gruss Mike


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

14. Jun 2005, 14:17
Beitrag # 14 von 19
Beitrag ID: #419748
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

ja, ich habe dies vor der Mittagspause ebenfalls entdeckt. Ich bin in dieselbe Falle getappt, wie damals, als ich
das verwandte Script für den Willem entwickelte. Die liebe Serversoftware reduziert hintereinanderfolgende
Zwischenräume auf einen. Bei den Worten "Beginn: ", "Ende:", "Dauer:" und "Total: "  müssen sich innerhalb
der Anführungszeichen insgesamt je acht Zeichen befinden. Sonst räumt das Script einen Return ab, die
Zählerei stimmt nicht mehr, die Total-Zeile erscheint nicht.

Ich habe den obigen Beitrag jetzt editiert und dort spezielle Zwischenräume eingesetzt. Bitte kopiere das
Script nochmals. Entschuldige bitte meine Vergesslichkeit.

Vorankündigung: Bald kommt eine Lösung, welche erlaubt, verschiedene Logfiles anzulegen.

Gruss, Hans


als Antwort auf: [#419735]

Zeitmessung mit Ordneraktion

Hans Haesler
  
Beiträge gesamt: 5826

14. Jun 2005, 14:31
Beitrag # 15 von 19
Beitrag ID: #419749
Bewertung:
(4543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

und hier kommt die angekündigte Variante. :-)

Bei jedem Öffnen des Ordners wird der Anwender aufgefordert, sich einzuloggen. Bei unterschiedlichen Namen
werden auch verschiedene Logfiles angelegt. Der Name des aktuellen Benutzers wird in die Datei "benutzer.txt"
geschrieben, welche der Einfachheit halber im selben Ordner untergebracht wird.

Ich weiss, das ist nicht die Automatik, welche Du Dir erhofft hast. Aber mehr kann ich nicht tun.
---
on opening folder this_folder
   tell application "Finder" to set folName to name of this_folder
   set userName to text returned of (display dialog ¬
      "Benutzername:" default answer "" buttons "OK" default button 1)
   set openTime to current date
   set usrFile to (this_folder as string) & "benutzer.txt"
   writeUser(usrFile, userName)
   set logFile to (this_folder as string) & folName & "_" & userName & ".txt"
   try
      alias logFile
      set curString to readCur(logFile)
      set nPara to count of paragraphs of curString
      if nPara = 5 then
         writeBegin1(logFile, openTime)
      else if nPara > 6 then
         if nPara mod 2 = 1 then
            writeBegin2(logFile, curString, openTime)
         end if
      end if
   on error
      writeBegin1(logFile, openTime)
   end try
end opening folder

on closing folder window for this_folder
   set closeTime to current date
   tell application "Finder" to set folName to name of this_folder
   set usrFile to (this_folder as string) & "benutzer.txt"
   set userName to readCur(usrFile)
   set logFile to (this_folder as string) & folName & "_" & userName & ".txt"
   try
      set curString to readCur(logFile)
      set nPara to count of paragraphs of curString
      if nPara = 2 then
         writeEnd1(logFile, curString, closeTime)
      else if nPara = 6 then
         writeEnd1(logFile, curString, closeTime)
         set curString to readCur(logFile)
         writeTotal(logFile, curString)
      else if nPara > 6 then
         if nPara mod 2 = 0 then
            writeEnd2(logFile, curString, closeTime)
            set curString to readCur(logFile)
            writeTotal(logFile, curString)
         end if
      end if
   end try
end closing folder window for

on readCur(filePath)
   set curString to read file filePath
   return curString
end readCur

on writeUser(usrFile, userName)
   try
      open for access file usrFile with write permission
      set eof of file usrFile to 0
      write (userName as string) to file usrFile
      close access file usrFile
   on error
      try
         close access file usrFile
      end try
   end try
end writeUser

on writeBegin1(logFile, openTime)
   set aString to "Beginn: " & openTime & return
   try
      open for access file logFile with write permission
      write aString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeBegin1

on writeBegin2(logFile, curString, openTime)
   set aString to text 1 thru -17 of curString as string
   set newString to aString & "Beginn: " & openTime & return
   try
      open for access file logFile with write permission
      set eof of file logFile to 0
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeBegin2

on writeEnd1(logFile, curString, closeTime)
   set oldTime to date (text 9 thru -1 of paragraph -2 of curString)
   if oldTime > closeTime then set oldTime to oldTime - 12 * hours
   set nSecs to closeTime - oldTime
   set diffTime to convToTime(nSecs)
   set newString to "Ende:   " & closeTime & return & "Dauer:  " & diffTime & return & return
   try
      open for access file logFile with write permission
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeEnd1

on writeEnd2(logFile, curString, closeTime)
   set oldTime to date (text 9 thru -1 of paragraph -2 of curString)
   if oldTime > closeTime then set oldTime to oldTime - 12 * hours
   set nSecs to closeTime - oldTime
   set diffTime to convToTime(nSecs)
   set newString to "Ende:   " & closeTime & return & "Dauer:  " & diffTime & return & return
   try
      open for access file logFile with write permission
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeEnd2

on writeTotal(logFile, curString)
   set nPara to count of paragraphs of curString
   set nSecs to 0
   repeat with i from 3 to nPara by 4
      set timeStr to (text 8 thru -1 of paragraph i of curString)
      set nSecs to convToSecs(nSecs, timeStr)
   end repeat
   set totTime to convToTime(nSecs)
   set newString to "Total:  " & totTime
   try
      open for access file logFile with write permission
      write newString to file logFile starting at eof
      close access file logFile
   on error
      try
         close access file logFile
      end try
   end try
end writeTotal

on convToSecs(nSecs, timeStr)
   set AppleScript's text item delimiters to {":"}
   set nSecs to nSecs + ((text item 1 of timeStr) as integer) * 3600
   set nSecs to nSecs + ((text item 2 of timeStr) as integer) * 60
   set nSecs to nSecs + ((text item 3 of timeStr) as integer)
   set AppleScript's text item delimiters to {""}
   return nSecs
end convToSecs

on convToTime(nSecs)
   set difH to text -2 thru -1 of ("0" & (nSecs div 3600))
   set restSecs to nSecs mod 3600
   set difM to text -2 thru -1 of ("0" & (restSecs div 60))
   set difS to text -2 thru -1 of ("0" & (restSecs mod 60))
   return difH & ":" & difM & ":" & difS
end convToTime

---

Gruss, Hans


als Antwort auf: [#419735]
X

Aktuell