115129
Goto Top

TCL - Datum und Uhrzeit auslesen und einer .txt-Datei nach jeder Ausführung zeilenweise übergeben

Hallo Community,

ich möchte per TCL-Script die Uhrzeit und das Datum des Systems auslesen und einer Textdatei übergeben.
Dabei soll nach jeder Ausführung des Scripts das aktuelle Datum und die aktuelle Uhrzeit in die nächste untere Zeile geschrieben werden,
wobei die bereits vorhandenen Zeilen bestehen bleiben sollen.

1. Datum und Uhrzeit des Systems auslesen:
set date [clock seconds]
set date [clock format $date -format {%Y.%m.%d  %T}]

2. Datum und Uhrzeit der Log-Datei .txt übergeben: (Ansatzweise...so....irgendwie...?)
set log [open "../log") w]  
puts $log "[lindex $date]"  

Folgendermaßen sollte die Textdatei z.B. aussehen:
2014.05.21 00:25:11   //erste Zeile
2014.05.19 15:43:32   //zweite Zeile
2014.05.14 12:23:27   //dritte Zeile
2014.05.03 06:18:07   //vierte Zeile
2014.04.25 21:48:22   //fünfte Zeile
2014.03.18 08:29:31   //sechste Zeile
u.s.w.

Wie Ihr sicherlich bemerkt habt, hab ich davon so gut wie keine Ahnung und hoffe auf tatkräftige Unterstützung face-smile

Besten Dank für Eure Antworten.

Grüße,
Blattlaus

Content-Key: 238655

Url: https://administrator.de/contentid/238655

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: colinardo
colinardo 21.05.2014 aktualisiert um 01:26:11 Uhr
Goto Top
Hallo Blatlaus,
ich muss gestehen das ich mit TCL noch nie Kontakt hatte, aber da man ja sein Leben lang neues ausprobieren sollte und mir "Programmieren" kein Fremdwort ist face-wink , hab ich mal schnell in die Doku geschaut und folgendes ist dabei rausgekommen, du warst schon ganz dicht dran mit deinem Code, nur der Parameter für den Filezugriff war hier nicht ganz optimal für dein Vorhaben:
set date [clock seconds]
set date [clock format $date -format {%Y.%m.%d  %T}]
set log [open "../log" a+]  
puts $log "$date"  
close $log
Das a+ bedeutet: Wenn die Datei nicht existiert, erstelle sie, ansonsten öffne das File und setze die Schreibposition ans Ende der Datei.
Also jedes mal wenn du ein File so öffnest, wird alles was du danach ins File schreibst, immer ans Ende dran gehängt.
http://www.tcl.tk/man/tcl8.5/tutorial/Tcl24.htm

Grüße Uwe
Mitglied: 115129
115129 21.05.2014 aktualisiert um 13:16:08 Uhr
Goto Top
Hallo Uwe,

vielen Dank für deine superschnelle Antwort.

Ich hätte eine weitere Frage.
Wenn ich nun ein Name in dieses bestehende Script übergeben möchte, wie wüsste das dann aussehen?

So...in etwa...?
proc input {} {
set name ""  
set date [clock seconds]
set date [clock format $date -format {%Y.%m.%d  %T}]
set log [open "../log" a+]  
puts $log "$date  | $name"  
close $log
}


Die log.txt sollte so gegliedert sein:
2014.05.21 00:25:11   |   Bert         //erste Zeile
2014.05.19 15:43:32   |   Stefan     //zweite Zeile
2014.05.14 12:23:27   |   Nadine    //dritte Zeile
2014.05.03 06:18:07   |   Nadine    //vierte Zeile
2014.04.25 21:48:22   |   Heike      //fünfte Zeile
2014.03.18 08:29:31   |   Dirk         //sechste Zeile
u.s.w.

Wäre dies ohne großen Aufwand realisierbar?

Vielen Dank schonmal face-smile

Gruß,
Blattlaus
Mitglied: colinardo
colinardo 21.05.2014 aktualisiert um 13:56:56 Uhr
Goto Top
also wenn du mit Parameterübergabe meinst, innerhalb eines Scriptes ginge das so:
proc writelog {name} {
  set date [clock seconds]
  set date [clock format $date -format {%Y.%m.%d  %T}]
  set log [open "../log" a+]  
  puts $log "$date | $name"  
  close $log
}
aufrufen der Prozedur dann so:
writelog "Heike"
http://www.tcl.tk/man/tcl8.5/tutorial/Tcl11.html

Wenn du stattdessen die Argumente schon in der Bash Kommandozeile übergeben willst kannst du das Script so schreiben:
proc writelog {name} {
  set date [clock seconds]
  set date [clock format $date -format {%Y.%m.%d  %T}]
  set log [open "./log.txt" a+]  
  puts $log "$date | $name"  
  close $log
}
writelog [lindex $argv 0]
und es dann so z.B. in der Bash aufrufen:
tclsh deinscript.tcl "Heike"
http://www.fundza.com/tcl/script_shell/arguments.html

Grüße Uwe
Mitglied: 115129
115129 21.05.2014 aktualisiert um 15:49:37 Uhr
Goto Top
Hallo Uwe,

danke für deine Antwort.

Ich habe mich wohl falsch ausgedrückt.

Ein Name wird dem Script übergeben, das Script soll den Namen mit der davorgestellten Systemzeit speichern.
Wird irgendwann ein neuer oder gar der gleiche Name übergeben (variabler Name), soll dasselbe geschehen allerdings in eine neue Zeile.

Die im voherigen Post gelistete Text-Datei ist nur, wie ich mir die Ausgabe vorstelle.

Das ist alles face-smile

Grüße
Mitglied: colinardo
colinardo 21.05.2014 aktualisiert um 15:49:43 Uhr
Goto Top
Zitat von @115129:
Ein Name wird dem Script übergeben, das Script soll den Namen mit der davorgestellten Systemzeit speichern.
Wird irgendwann ein neuer oder gar der gleiche Name übergeben (variabler Name), soll dasselbe geschehen allerdings in eine
neue Zeile.

Das ist alles face-smile
aber das tut genau das zweite Script von oben ....
Mitglied: 115129
115129 21.05.2014 aktualisiert um 15:50:57 Uhr
Goto Top
Alles klar, ich schaue mir das später genauer an...

Danke face-smile
Mitglied: 115129
115129 21.05.2014 um 19:24:21 Uhr
Goto Top
Hallo Uwe,

ich nochmal face-smile *nerv*

Ok, soweit so gut...

Wie würde das Script ausschauen mit folgendem Ablauf:

1. Diesem Script wird eine Uhrzeit über eine Variable übergeben, die Formatierung wie folgt: 19:16:42
2. Das Datum soll vom der PC-Systemzeit ausgelesen werden, die Formatierung wie folgt: 2014.05.21
3. Die bereits erwähnte Namensvariablen werden ebenso dem Script übergeben
4. Nun alles zusammensetzen in folgender Formatierung: 2014.05.21 19:16:42 | Elke
5. Zuguterletzt die zusammengefasste Variable der log.txt übergeben
6. Ebenso bereits erwähnt, bei neuer Übergabe eines Namens aktuellen Zeitstempel setzen und in nächste Zeile anreihen.
Vorherige Zeitstempel unberührt lassen.

Das sollte dann das Endresultat sein.

So Interessant das Thema auch ist, sieht man den Quellcode wird einem so manches verständlicher....vielleicht :p

Grüße
Mitglied: colinardo
colinardo 21.05.2014 aktualisiert um 19:50:56 Uhr
Goto Top
Es wäre mal gut zu wissen, wie du das mit der Übergabe der Parameter an das Script meinst, bzw, auf welchem OS du arbeitest. Meinst du die Übergabe der Parameter an die Funktion im Script selber, oder eine Übergabe von Parametern von der Kommandozeile an ein Script was als Datei gespeichert ist ??? Willst du mehrere Namen gleichzeitig an das Script übergeben ??

so wie ich das verstanden habe:
proc writelog {name uhrzeit} {
  # aktuelles Datum in Variable schreiben
  set date [clock seconds]
  set date [clock format $date -format {%Y.%m.%d}]
  # Zeile zusammensetzen
  set line "$date $uhrzeit | $name"  
  # Logfile im Append-Modus öffnen
  set log [open "./log.txt" a+]  
  # Zeile in Logfile schreiben
  puts $log $line
  # Handle zum Logfile schließen (flush)
  close $log
}
# der writelog-prozedur die zwei Parameter der Kommandozeile übergeben (Name / Uhrzeit)
writelog [lindex $argv 0] [lindex $argv 1]
Aufruf dann so
tclsh deinscript.tcl "Elke" "10:00:00"

Mit diesem Tutorial sollte das kein Problem mehr darstellen: http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html
Die nötigen Fetzen habe ich dir ja geliefert, damit solltest du das umsetzen können. Das hier ist ja kein Hausaufgaben-Lösen Forum.
Wenn ich das gestern in 10 Minuten Lesen im Tutorial auf dem Smartphone hier schaffe (hatte vorher sonst noch nie was mit TCL gemacht!!) sollte das für dich eigentlich mit etwas Lesen eine Lösbare Aufgabe darstellen.

Viel Erfolg
Grüße Uwe
Mitglied: 115129
115129 21.05.2014 um 20:29:37 Uhr
Goto Top
Ok, danke dir für deine tatkräftige Unterstützung.

Werde mich durch den Link kämpfen.

Auf ein ander mal face-smile

Grüße