aufgelistete dateien nach alter sortiern=>1 tag alt,5 woc

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
User avatar
versalzen
Power Member
Power Member
Posts: 670
Joined: 2003-09-16, 11:52 UTC
Location: kölle, linksrheinisch.

aufgelistete dateien nach alter sortiern=>1 tag alt,5 woc

Post by *versalzen »

hi, ich suche die möglichkeit, die aufgelisteten dateien nach alter zu sortiern und auf einen blick zu lesen, wie alt diese dateien (grundlage die jetzige systemuhrzeit) sind.

quasi über ein contentplugin (welches ich bis dato noch nicht gefunden habe) welches mir diese infos anzeigt:

alter in sekunden
alter in minuten
alter in stunden
alter in tagen
alter in tagen
alter in wochen
alter in monaten
alter in jahren

gibt es solch ein pluging oder ist das sonstwie zu bewältigen?
Was nützt der Löffel für die Weisheit, wenn man zu weit vom Suppentopf entfernt sitzt?

Mario
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Post by *van Dusen »

Du könntest das Script Content Plugin 0.1.0.1 mit folgendem Script <Dateialter.vbs> verwenden:

Code: Select all

'Script for Script Content Plugin
'(c)Lev Freidin, 2005
'http://www.totalcmd.net/plugring/script_wdx.html
'http://wincmd.ru/plugring/script_wdx.html
'Script <Dateialter.vbs>, 29.01.2006, van Dusen

'Argumente für DateDiff-Parameter "Interval":
'yyyy Jahr 
'q    Quuartal 
'm    Monat 
'y    Tag des Jahres 
'd    Tag 
'w    Wochentag
'ww   Kalenderwoche 
'h    Stunde
'n    Minute 
's    Sekunde

Const ForReading = 1
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(filename)

sDateNow = Now
sDateMod = f.DateLastModified

sDateDiffJabs = DateDiff("yyyy", sDateMod, sDateNow, 0, 0)
sDateDiffMabs = DateDiff("m", sDateMod, sDateNow, 0, 0)
sDateDiffWabs = DateDiff("ww", sDateMod, sDateNow, 0, 0)
sDateDiffTabs = DateDiff("d", sDateMod, sDateNow, 0, 0)

sDateDiffFmt = "JMThms"

Select Case sDateDiffFmt
   '*** Dateialter in Jahren
   Case "J"
      sResult = sDateDiffJabs & " Jahre alt"

   '*** Dateialter in Monaten
   Case "M"
       sResult = sDateDiffMabs & " Monate alt"

   '*** Dateialter in Wochen
   Case "W"
       sResult = sDateDiffWabs & " Wochen alt"

  '*** Dateialter in Tagen
   Case "T"
      sResult = sDateDiffTabs & " Tage alt"

   '*** Dateialter in Stunden
   Case "h"
      sResult = DateDiff("h", sDateMod, sDateNow, 0, 0) & " Stunden alt"

   '*** Dateialter in Minuten
   Case "m"
      sResult = DateDiff("n", sDateMod, sDateNow, 0, 0) & " Minuten alt"

   '*** Dateialter in Sekunden
   Case "s"
      sResult = DateDiff("s", sDateMod, sDateNow, 0, 0) & " Sekunden alt"

   '*** Dateialter in Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden
   Case Else

      sDateDiff = DateDiff("yyyy", sDateMod, sDateNow, 0, 0)
      If DatePart("yyyy", sDateNow, 0, 0) > DatePart("yyyy", sDateMod, 0, 0) Then sDateDiff = sDateDiff - 1
      sDateDiffJ = sDateDiff
      sDateMod = DateAdd("yyyy", sDateDiff, sDateMod)
      
      sDateDiff = DateDiff("m", sDateMod, sDateNow, 0, 0)
      If DatePart("m", sDateNow, 0, 0) > DatePart("m", sDateMod, 0, 0) Then sDateDiff = sDateDiff - 1
      sDateDiffM = sDateDiff
      If sDateDiffM < 0 Then
         sDateDiffJ = sDateDiffJ - 1
         sDateDiffM = sDateDiffM + 1
      End If
      sDateMod = DateAdd("m", sDateDiff, sDateMod)
      
      sDateDiff = DateDiff("d", sDateMod, sDateNow, 0, 0)
      If DatePart("d", sDateNow, 0, 0) > DatePart("d", sDateMod, 0, 0) Then sDateDiff = sDateDiff - 1
      sDateDiffT = sDateDiff
      If sDateDiffT < 0 Then
         sDateDiffM = sDateDiffM - 1
         sDateDiffT = sDateDiffT + 1
      End If
      sDateMod = DateAdd("d", sDateDiff, sDateMod)
      
      sDateDiff =  sDateNow - sDateMod
      sDateDiffh = DatePart("h", sDateDiff, 0, 0)
      sDateDiffn = DatePart("n", sDateDiff, 0, 0)
      sDateDiffs = DatePart("s", sDateDiff, 0, 0)
            
      'sResult = ""
      'sResult = sResult & sDateDiffJ & "J - " & sDateDiffM & "M - " & sDateDiffT & "T - "
      'sResult = sResult & sDateDiffh & "h - " & sDateDiffn & "m - " & sDateDiffs & "s"

      sDateDiffJ = Right("0" & sDateDiffJ, 2) & "-"
      sDateDiffM = Right("0" & sDateDiffM, 2) & "-"
      sDateDiffT = Right("0" & sDateDiffT, 2) & " "
      sDateDiffh = Right("0" & sDateDiffh, 2) & ":"
      sDateDiffn = Right("0" & sDateDiffn, 2) & ":"
      sDateDiffs = Right("0" & sDateDiffs, 2)
      

      sResult = ""
      sResult = sResult & sDateDiffJ & sDateDiffM & sDateDiffT
      sResult = sResult & sDateDiffh & sDateDiffn & sDateDiffs

End Select

sDateGrp = ""
If sDateDiffJabs > 2 Then sDateGrp = "Vor langer Zeit"
If sDateDiffJabs = 2 Then sDateGrp = "Vor zwei Jahren"
If sDateDiffJabs = 1 Then sDateGrp = "Letztes Jahr"
If sDateDiffJabs = 0 Then sDateGrp = "Anfang des Jahres"
If sDateDiffMabs = 2 Then sDateGrp = "Vor zwei Monaten"
If sDateDiffMabs = 1 Then sDateGrp = "Letzten Monat"
If sDateDiffMabs = 0 Then sDateGrp = "Anfang des Monats"
If sDateDiffWabs = 2 Then sDateGrp = "Vor zwei Wochen"
If sDateDiffWabs = 1 Then sDateGrp = "Letzte Woche"
If sDateDiffWabs = 0 Then sDateGrp = "Anfang der Woche"
If sDateDiffTabs = 2 Then sDateGrp = "Vorgestern"
If sDateDiffTabs = 1 Then sDateGrp = "Gestern"
If sDateDiffTabs = 0 Then sDateGrp = "Heute"

sResult = sResult & "  -  " & sDateGrp

content = sResult

Set fso=nothing
Set f=nothing

Die dazugehörige <script.ini>:

Code: Select all

[Script]
Section=Dateialter

[Defaults]
LongName=1
ParseDirs=0

[Dateialter]
Script=dateialter.vbs

Ändere im Script <dateialter.vbs> die Zeile sDateDiffFmt = "JMThms" je nach gewünschter Ausgabe folgendermaßen ab:

sDateDiffFmt = "J" ... Liefert das Dateialter in Jahren
sDateDiffFmt = "M" ... Liefert das Dateialter in Monaten
sDateDiffFmt = "T" ... Liefert das Dateialter in Tagen
sDateDiffFmt = "W" ... Liefert das Dateialter in Wochen
sDateDiffFmt = "h" ... Liefert das Dateialter in Stunden
sDateDiffFmt = "m" ... Liefert das Dateialter in Minuten
sDateDiffFmt = "s" ... Liefert das Dateialter in Sekunden

Sonst, z.B.
sDateDiffFmt = "JMThms" ... Liefert das Dateialter in Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden
(im Anzeigeformat JJ-MM-TT hh:mm:ss)

Allerdings lege ich für den Fall sDateDiffFmt = "JMThms" meine Hand nicht ins Feuer, dass die Berechnung der auf die Datums-/Zeitkomponenten jeweils entfallenden Anteile korrekt ist (u.a. wegen der monatsspezifischen Monatsletzten, Schaltjahren usw.).
Weiß hier jemand eine elegante und vor allem verbindlich korrekte Lösung?

EDIT 29.01.2006 20:54
Script ergänzt um die Ausgabe von Gruppierungstexten wie im Win Explorer oder im SC ("Heute", "Letzte Woche", "Vor langer Zeit" usw.)
User avatar
versalzen
Power Member
Power Member
Posts: 670
Joined: 2003-09-16, 11:52 UTC
Location: kölle, linksrheinisch.

Post by *versalzen »

van Dusen wrote: sDateDiffFmt = "J" ... Liefert das Dateialter in Jahren
sDateDiffFmt = "M" ... Liefert das Dateialter in Monaten
sDateDiffFmt = "T" ... Liefert das Dateialter in Tagen
sDateDiffFmt = "W" ... Liefert das Dateialter in Wochen
sDateDiffFmt = "h" ... Liefert das Dateialter in Stunden
sDateDiffFmt = "m" ... Liefert das Dateialter in Minuten
sDateDiffFmt = "s" ... Liefert das Dateialter in Sekunden

Sonst, z.B.
sDateDiffFmt = "JMThms" ... Liefert das Dateialter in Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden
(im Anzeigeformat JJ-MM-TT hh:mm:ss)
vielen dank!
es war zwar etwas knifflich, mich mit dem script content plugin eingehender zu beschäftigen, aber letztendlich war es ein erfolg :-)

allerdings bin ich noch nicht ganz fertig (weder mit dem sehen der möglichkeiten, noch mit meinen wunschausbau) :-)

ok, verstehe ich das prinzip von TC und dieser scripte so richtig,
das ich, wenn ich bei meiner urspünglichen idee bleibe, für jedes sortierbare alter (minuten/tage/jahre/...) ein eigenes *.vbs erstellen muss, mit der jeweiligen ausgabe in einer benutzerdefinierten spalte?

aus den dateien script.ini und readme.txt aus dem script.wdx verzeichnis entnehme ich, das man vielleicht doch anders vorgehen kann, als ich es gemacht habe, nur erschliesst sich mir der weg noch nicht ganz.

so habe ich es bisher gelöst (sehr umständlich, wie ich meine, da viel doppelter code aktuell gehalten werden muss und viel doppelter dateiinhalt):

ich habe es beim ersten posting natürlich nicht so richtig ausformuliert, aber mein wunsch ist natürlich, das ich z.b auf eine spalte "minuten", "tage", "wochen", "jahre" ... klicken kann und dann die ganzen dateien entsprechend ihres alters sortiert werden.

meine installierten, angelegten scripte und umbenannten kopien von script.wdx (lt. readme.txt von script.wdx):
  • C:\Programme\tc\plugins\wdx\script\Dateialter
    | Dateialter.vbs
    | Dateialter.wdx
    | script.ini
    +---Monat
    | Monat.vbs
    | Monat.wdx
    | script.ini
    +---Stunde
    | script.ini
    | Stunde.vbs
    | Stunde.wdx
    +---Tag
    | script.ini
    | Tag.vbs
    | Tag.wdx
    \---Woche
    script.ini
    Woche.vbs
    Woche.wdx
die *.vbs dateien in den verzeichnissen (Tag/Woche/...) sind alle identisch, bis auf die jeweilige, angepasste zeile:

sDateDiffFmt = "m" / sDateDiffFmt = "W" / etc...

und die tatsache, das ich die zeile

sResult = sResult & " - " & sDateGrp

auskommentiert habe, damit wirklich nur die "nakten zahlen" angezeigt werden.



die script.ini dateien folgen auch alle den selben schema, z.b:
C:\Programme\tc\plugins\wdx\script\Dateialter\Woche\script.ini

Code: Select all

[Script]
Section=Woche

[Defaults]
LongName=1
ParseDirs=0

[Woche]
Script=Woche.vbs
in der wincmd.ini

Code: Select all

[CustomFields]
Headers999=ursprung\nalter (lange anzeige)\ntag\nmonat\nstunde\nwoche
Contents999=[=shelldetails.Geändert am]\n[=dateialter.Result]\n[=tag.Result]\n[=monat.Result]\n[=stunde.Result]\n[=woche.Result]
Options999=1288|1
Widths999=90,20,65,155,20,28,33,28
jetzt ist es einigermassen so, wie ich es "geplant" hatte :-)



ich habe mir die freiheit genommen und dein script mal etwas abgeändert. allerdings nur rudimentär, als änderungs-vorschlag meinerseits.
aufgefallen ist, das 1 stunden / 1 tage / 1 Jahre angezeigt werden.

ich habe dies einmal dilletantisch so gelöst:

Code: Select all

  '*** Dateialter in Monaten
   Case "M"
       sResult = sDateDiffMabs & " Monate alt"
   If sDateDiffMabs = 1 Then sResult = sDateDiffMabs & " Monat alt"
hier nochmal das leicht geänderte script <Dateialter.vbs>:

Code: Select all

...
...
...
Const ForReading = 1
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(filename)

sDateNow = Now
sDateMod = f.DateLastModified

sDateDiffJabs = DateDiff("yyyy", sDateMod, sDateNow, 0, 0)
sDateDiffMabs = DateDiff("m", sDateMod, sDateNow, 0, 0)
sDateDiffWabs = DateDiff("ww", sDateMod, sDateNow, 0, 0)
sDateDiffTabs = DateDiff("d", sDateMod, sDateNow, 0, 0)
sDateDiffNabs = DateDiff("n", sDateMod, sDateNow, 0, 0)

sDateDiffFmt = "hmsJMT"

Select Case sDateDiffFmt
   '*** Dateialter in Jahren
   Case "J"
      sResult = sDateDiffJabs & " Jahre alt"

   '*** Dateialter in Monaten
   Case "M"
       sResult = sDateDiffMabs & " Monate alt"
   If sDateDiffMabs = 1 Then sResult = sDateDiffMabs & " Monat alt"

   '*** Dateialter in Wochen
   Case "W"
       sResult = sDateDiffWabs & " Wochen alt"

  '*** Dateialter in Tagen
   Case "T"

      sResult = sDateDiffTabs & " Tage alt"
   If sDateDiffTabs = 1 Then sResult = sDateDiffTabs & " Tag alt"

   '*** Dateialter in Stunden
   Case "h"
      sResult = DateDiff("h", sDateMod, sDateNow, 0, 0) & " Stunden alt"

   '*** Dateialter in Minuten
   Case "m"
      sResult = DateDiff("n", sDateMod, sDateNow, 0, 0) & " Minuten alt"

   '*** Dateialter in Sekunden
   Case "s"
      sResult = DateDiff("s", sDateMod, sDateNow, 0, 0) & " Sekunden alt"

   '*** Dateialter in Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden
   Case Else

...
...
...

End Select

sDateGrp = ""
If sDateDiffJabs > 7 Then sDateGrp = "Vor sehr langer Zeit"
If sDateDiffJabs > 5 Then sDateGrp = "Vor langer Zeit"
If sDateDiffJabs = 4 Then sDateGrp = "Vor vier Jahren"
If sDateDiffJabs = 3 Then sDateGrp = "Vor drei Jahren"
If sDateDiffJabs = 2 Then sDateGrp = "Vor zwei Jahren"
If sDateDiffJabs = 1 Then sDateGrp = "Letztes Jahr"
If sDateDiffJabs = 0 Then sDateGrp = "Anfang des Jahres"
If sDateDiffMabs = 9 Then sDateGrp = "Vor neun Monaten"
If sDateDiffMabs = 8 Then sDateGrp = "Vor acht Monaten"
If sDateDiffMabs = 7 Then sDateGrp = "Vor sieben Monaten"
If sDateDiffMabs = 6 Then sDateGrp = "Vor sechs Monaten"
If sDateDiffMabs = 5 Then sDateGrp = "Vor fünf Monaten"
If sDateDiffMabs = 4 Then sDateGrp = "Vor vier Monaten"
If sDateDiffMabs = 3 Then sDateGrp = "Vor drei Monaten"
If sDateDiffMabs = 2 Then sDateGrp = "Vor zwei Monaten"
If sDateDiffMabs = 1 Then sDateGrp = "Letzten Monat"
If sDateDiffMabs = 0 Then sDateGrp = "Anfang des Monats"
If sDateDiffWabs = 2 Then sDateGrp = "Vor zwei Wochen"
If sDateDiffWabs = 1 Then sDateGrp = "Letzte Woche"
If sDateDiffWabs = 0 Then sDateGrp = "Anfang der Woche"
If sDateDiffTabs = 2 Then sDateGrp = "Vorgestern"
If sDateDiffTabs = 1 Then sDateGrp = "Gestern"
If sDateDiffTabs = 0 Then sDateGrp = "Heute"

If sDateDiffNabs < 540 Then sDateGrp = "vor 9 Stunden"
If sDateDiffNabs < 480 Then sDateGrp = "vor 8 Stunden"
If sDateDiffNabs < 420 Then sDateGrp = "vor 7 Stunden"
If sDateDiffNabs < 360 Then sDateGrp = "vor 6 Stunden"
If sDateDiffNabs < 300 Then sDateGrp = "vor 5 Stunden"
If sDateDiffNabs < 240 Then sDateGrp = "vor 4 Stunden"
If sDateDiffNabs < 180 Then sDateGrp = "vor 3 Stunden"
If sDateDiffNabs < 120 Then sDateGrp = "vor 2 Stunden"
If sDateDiffNabs < 060 Then sDateGrp = "vor einer Stunde"
If sDateDiffNabs < 030 Then sDateGrp = "vor einer halben Stunde"
If sDateDiffNabs < 015 Then sDateGrp = "vor 15 Minuten"
If sDateDiffNabs < 010 Then sDateGrp = "Gerade Eben"

If sDateDiffNabs < 0 Then sDateGrp = "Du Visionär"


'sResult = sResult & "  -  " & sDateGrp
'auskommentiert, ob der übersichtlichkeit

content = sResult

Set fso=nothing
Set f=nothing
van Dusen wrote:EDIT 29.01.2006 20:54
Script ergänzt um die Ausgabe von Gruppierungstexten wie im Win Explorer oder im SC ("Heute", "Letzte Woche", "Vor langer Zeit" usw.)
die ausgabe von sDateGrp gefällt mir sehr gut, ich habe noch ein paar mir wichtige angehangen. allerdings wäre dies auch in einer eigenen spalte schöner, weil praktischer/sortierbarer


van Dusen wrote:Allerdings lege ich für den Fall sDateDiffFmt = "JMThms" meine Hand nicht ins Feuer, dass die Berechnung der auf die Datums-/Zeitkomponenten jeweils entfallenden Anteile korrekt ist (u.a. wegen der monatsspezifischen Monatsletzten, Schaltjahren usw.).
hier ein kleiner bug-report (keine lösung):

nun ist es: 31.01.2006 05:55

sDateDiffFmt = monat
mit einer datei 30.12.2006 05:44 ergibt "-11 monate alt"
mit einer datei 30.11.2006 05:44 ergibt "-10 monate alt"

mit
sDateDiffFmt = minuten
mit einer datei 30.12.2006 05:44 ergibt "-480929 minuten alt"






zum abschluss noch ein letzte, direkte, frage:
kann es sein, das das angezeigte datumsforma sDateDiffFmt = "hmsJMT" keinen unterschied zeigt zu sDateDiffFmt = "JMThms"
bei beiden versionen stehen die sekunden an letzter stelle.
Was nützt der Löffel für die Weisheit, wenn man zu weit vom Suppentopf entfernt sitzt?

Mario
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Post by *van Dusen »

2versalzen
[...] ok, verstehe ich das prinzip von TC und dieser scripte so richtig,
das ich, wenn ich bei meiner urspünglichen idee bleibe, für jedes sortierbare alter (minuten/tage/jahre/...) ein eigenes *.vbs erstellen muss, mit der jeweiligen ausgabe in einer benutzerdefinierten spalte? [...]
Ja, das ScriptWDX-Plugin unterstützt in der zurzeit aktuellen Version leider nur eine Spalte. Dies ist eine Einschränkung des ScriptWDX-Plugins, nicht des TC.

Aber Du hast das Problem ja auf die empfohlene Weise gelöst, nämlich für jede auszugebende Spalte eine Kopie der Datei script.wdx anzulegen, die Kopie umzubenennen und die umbenannte wdx dann zu registrieren. Um zumindest ein paar Bytes Plattenspeicherplatz zu sparen und um bei eventuellen Updates des Plugins nur eine Kopie des Plugins aktualisieren zu müssen, lege ich die Duplikate der script.wdx immer als HardLinks statt als Kopien an.

Die Scripte für die Spalten, die das Dateialter nicht aufgeteilt auf Jahre, Monate usw., sondern in einer Einheit ausgeben, kannst Du ja auch eindampfen. Tag.vbs kann z.B. so aussehen:

Code: Select all

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
content = DateDiff("d", fso.GetFile(filename).DateLastModified, Now, 0, 0) & " Tag(e) alt"
Set fso=nothing
[...] ich habe mir die freiheit genommen und dein script mal etwas abgeändert. [...]
Nur zu, dafür isses ja da :)

[...] die ausgabe von sDateGrp gefällt mir sehr gut, ich habe noch ein paar mir wichtige angehangen. allerdings wäre dies auch in einer eigenen spalte schöner, weil praktischer/sortierbarer [...]
Geht leider auch nur mit Hilfe einer separaten Kopie der script.wdx

hier ein kleiner bug-report (keine lösung):

nun ist es: 31.01.2006 05:55

sDateDiffFmt = monat
mit einer datei 30.12.2006 05:44 ergibt "-11 monate alt"
Rein formal ist das ist m.E. korrekt. Positive Werte liegen auf einer gedachten Zeitachse mit "Jetzt" als Nullpunkt in der Vergangenheit, negative Werte in der Zukunft. Deine Testdatei wird also erst in 11 Monaten aktuell sein (erinnert mich ein bisschen an den alten Hut: "In einem Raum befinden sich 3 Personen. Wenn 5 Personen den Raum verlassen, müssen 2 wieder hineingehen, damit der Raum leer ist" ;) ).
Den Fall Datum zuletzt geändert am > Jetzt könnte man aber abfangen und den Text mit der Ergebnisausgabe entsprechend formulieren.

[...] kann es sein, das das angezeigte datumsforma sDateDiffFmt = "hmsJMT" keinen unterschied zeigt zu sDateDiffFmt = "JMThms" [...]
Absolut. Denn es wird in beiden Fällen der Case Else-Zweig des Select...End Select-Blocks durchlaufen. Die Bezeichnung der Variablen sDateDiffFmt ist unglücklich gewählt, denn sie suggeriert fälschlicherweise, dass man hiermit ein benutzerdefiniertes Datums-/Uhrzeitformat mit J, M, T usw. als Platzhalter für die Datumsteile festlegen kann.
Post Reply