binderalex
Goto Top

Alter eines Verzeichnisses auslesen

Guten Morgen zusammen face-smile

seit längerem beschäftigt mich eine klitzekleine Aufgabe, die jetzt aber so langsam richtig nervig und auch dringend wird.

Ich sollte ein Skript schreiben ((Batch, VB, ...) eben irgendwas, dass per geplanten Task aufgerufen werden kann) welches das Alter eines Verzeichnisses ausliest. Es geht also nicht um eine simple Datei, welche per Wasfile.exe abgeprüft werden könnte, sondern um ein Verzeichnis.

Damit das ganze etwas verständlicher wird hier eine kurze Erläuterung:

Unser DMS (Dokumentmanagementsystem) legt auf dem "Scan-PC" für jeden gescannten Stapel an Belegen einen Ordner mit Datum und Uhrzeit an (Beispiel: ORDNER_Datum_Uhrzeit). Von diesem PC läuft dann die Weiterverarbeitung auf den Server ... sollte jetzt eines dieser angelegten Verzeichnisse älter als 4 Stunden werden, soll eine Mail (per Sendmail.exe) verschickt werden.

Mit einer Datei wäre das alles recht simpel ... abe rin diesem Fall komm ich überhaupt nicht mit den sich ändernden Verzeichnisnamen zurecht udn weiß auch nicht wie ich das Alter eines Verzeichnisses überprüfen kann face-sad Könnte mir da viell. jemand weiterhelfen? Wäre echt super face-smile

Viele Grüße
Alex

[Edit Biber] Habe bastlas letztem Kommentar nichts hinzufügen.
Bzw. hätte es nie so freundlich formulieren können.
(Habe einen Tag früher schon meine getippte Antwort unabgesendet entsorgt.)
Ich setze den Thread auf "Gelöst" und "Geschlossen" und harre der Beiträge, die noch kommen werden.
[/Edit]

Content-ID: 90245

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

Ausgedruckt am: 20.11.2024 um 03:11 Uhr

Biber
Biber 20.06.2008 um 10:27:12 Uhr
Goto Top
Moin BinderAlex,

wenn du es mit reinen Batchmitteln machen willst, wären die Ansätze in etwa so:

  • vom aktuellen Datum die Minuten seit Mitternacht ermitteln
>for /f "tokens=1,2 delims=: " %i in ('time /t') do @set /a 60*(1%i-100) +(1%j)-100  
619
[Beispiel am CMD-Prompt. 619 = 10 Stunden * 60 Minuten + 19 Minuten =10:19h]
  • das Alter eines Verzeichnisse "von heute" ermitteln
>for /f "tokens=2,3 delims=: " %i in ('dir /ad /tc^|findstr /b "%date%"') do @set /a 60*(1%i-100) +(1%j)-100  
574
--> hier wird das "creationDate" eines Verzeichnisses namens "vonheute" mit der Uhrzeit 9:34 angezeigt.

Eigentlich brauchst Du dann nur noch die beiden "Zeiten seit Mitternacht in Minuten" zu vergleichen und dann aktiv zu werden, wenn die Differenz größer als 240 (4 Stunden a 60 Minuten) ist.

Grüße
Biber
[Edit 23.06.2008] ...und ich sach' noch: mach das mit einem Batch-Oneliner.
Aber nein... mit VBS isses ja auch "schnell gemacht".. *kopfschüttel* [/Edit]
bastla
bastla 20.06.2008 um 10:56:59 Uhr
Goto Top
Hallo BinderAlex!

Alternativ bzw ergänzend zu Bibers Vorschlag eine Batch-Variante mit Verwendung eines temporären VBScripts zur Ermittlung der Zeitdifferenz (damit wird, was aber vermutlich ohnehin nicht nötig sein dürfte, auch ein Tagwechsel berücksichtigt - ein um 22:20 durchgeführter Scan "veraltet" um 2:20 des nächsten Tages) und einer Schleife, um alle vorhandenen Unterordner des anzugebenden Basisordners zu überprüfen:
@echo off & setlocal
set "Basis=D:\Dein Ordner mit den zu verarbeitenden Unterordnern"  
set /a MaxAge=240

set C=%temp%\ChkAge.vbs
echo WScript.Echo DateDiff("n",Now,WScript.Arguments(0))>%C%  

for /d %%v in ("%Basis%\*.*") do call :ProcessFolder "%%v"  
goto :eof

:ProcessFolder
for /f "tokens=2-3 delims=_" %%i in (%~n1) do set "DT=%%i %%j"  
for /f %%i in ('cscript //nologo %C% %DT%') do set /a "Age=%%i"  
if %Age% gtr %MaxAge% (
    echo Alle erforderlichen Arbeitsschritte
)
goto :eof
Wie bei Biber erfolgt auch hier die Zeitangabe in Minuten.

Die "Entstehungsdaten" (Datum und Uhrzeit) werden (auf Basis Deiner allgemeinen Beschreibung) dem Ordnernamen entnommen, es kann aber natürlich auch das "Erstellungsdatum" ("creationDate" - siehe oben) eingesetzt werden. Dazu wäre die Zeile 12 zu ändern auf:
for /f "tokens=1-2" %%i in ('dir "%Basis%" /ad /tc^|findstr /i /c:"%~n1"') do set "DT=%%i %%j"  
Grüße
bastla

[Edit] Umleitung der Ausgabe in Zeile 6 ergänzt. [/Edit]
BinderAlex
BinderAlex 20.06.2008 um 11:40:32 Uhr
Goto Top
Hallo biber und bastla,

na das ist ja super, ging ja flott face-smile Jetzt werd ich mich mal hinsetzen und das soweit fertig machen (so viel Arbeit bleibt mir nach bastla´s Vorschlag ja nicht mehr *g*) Auf jeden Fall vielen vielen Dank ... denke damit bekomm ich das hin. Wenn nicht, gibts ja immer noch die Möglichkeit das ich mich hier noch mal melde face-smile
BinderAlex
BinderAlex 23.06.2008 um 08:27:25 Uhr
Goto Top
Hmmm 2 Dinge ...

1. Es macht was, aber nicht das was es soll
2. für was ist Zeile 06. bei bastla?

Zu 1:
Habe die Zeilen von bastla in ein .bat gepackt und die benötigten Anweisungen Zeile 02 (C:\Test), Zeile 03 (auf 2 Minuten, zu Testzwecken) und Zeile 15 (echo-Befehl) ergänzt. Danach wurde das Skript ausgeführt.
Skript läuft an, gibt Zeile 06 in der cmd aus, arbeitet kurz (ca. 2-3 Sek.) und fertig. Mehr kommt nicht, keine weiteren Ausgaben auf dem Bildschirm (obwohl in Zeile 15
zu Testzwecken noch ein echo-Befehel steht).
Scheint also so, als würde er beim Schleifenaufruf ind Zeile 08 gar nicht zur Sprungmarke :ProcessFolder springen. Jetzt kann es natürlich druchaus sein, dass ich etwas vergessen habe anzupassen *ggg* Hier mal das derzeitge Skript:

@echo off & setlocal

set "Basis=C:\Test"
set /a MaxAge=2
set C=%temp%\ChkAge.vbs


echo WScript.Echo DateDiff("n",Now,WScript.Arguments(0))
for /d %%v in ("%Basis%\*.*") do call :ProcessFolder "%%v"
goto :eof


:ProcessFolder
for /f "tokens=1-2" %%i in ('dir "%Basis%" /ad /tc^|findstr /i /c:"%~n1"') do set "DT=%%i %%j"
for /f %%i in ('cscript //nologo %C% %DT%') do set /a "Age=%%i"

if %Age% gtr %MaxAge% (

echo Das Skript funktioniert
)

goto :eof

Sodele und nun erschlagt mich *g* Wo ist mein Fehler? face-smile
bastla
bastla 23.06.2008 um 09:15:04 Uhr
Goto Top
Hallo BinderAlex!

für was ist Zeile 06. bei bastla?
In der aktuellen Form: sinnlos face-sad - es fehlt die Umleitung in die Temporärdatei %C%, daher:
echo WScript.Echo DateDiff("n",Now,WScript.Arguments(0))>%C%  
Es wird damit ein temporäres VBScript zur Alterberechnung erzeugt (und dann in Zeile 13 aufgerufen).

Grüße
bastla

P.S.: Zur Sicherheit trage ich das auch oben noch nach ...
BinderAlex
BinderAlex 23.06.2008 um 09:24:35 Uhr
Goto Top
Ahhhh ok face-smile

Hab das gleich ergänzt und laufen lassen ... tut leider immer noch net face-sad

Skript läuft ohne Fehlermeldung, leider kommt aber auch kein Echo "Das Skript funktioniert", was ja egtl. der Fall sein sollte?!

Habe unter C:\Test 3 Ordner erstellt heute um 07:32 , 07:34 und 07:35. Wenn das Skript jetzt um 09:23 mit MaxAge 5 Minuten ausgeführt wird, sollte doch egtl. was passieren oder?!
bastla
bastla 23.06.2008 um 14:10:19 Uhr
Goto Top
Hallo BinderAlex!

Da hab' ich ja ziemlich geschludert ...

Neue Version:
@echo off & setlocal

set "Basis=C:\Test"  
set /a MaxAge=2
set C=%temp%\ChkAge.vbs


echo WScript.Echo DateDiff("n",WScript.Arguments(0),Now)>%C%  
for /d %%v in ("%Basis%\*.*") do call :ProcessFolder "%%v"  
goto :eof


:ProcessFolder
for /f "tokens=1-2" %%i in ('dir "%Basis%" /ad /tc^|findstr /i /c:"%~n1"') do set "DT=%%i %%j"  
for /f %%i in ('cscript //nologo %C% "%DT%"') do set /a "Age=%%i"  

if %Age% gtr %MaxAge% (
echo Das Skript funktioniert fuer %1
)

goto :eof
Grüße
bastla
BinderAlex
BinderAlex 24.06.2008 um 15:28:55 Uhr
Goto Top
Sssuuuppper face-smile Dankeschön face-smile Funktioniert einwandfrei ...

Aber da wir grad dabei sind, welche Zeile muss ich ändern, damit das Erstell-Jahr von Dateien unterhalb eines Verzeichnisses ausgelesen wird? face-smile

Das ist ein zweites Problemchen, könnt ich grad mit erledigen *g*
In einem bestimmten, festen Verzeichniss, sollen alle enthaltenen Dateien (alle mit Endung .bak) anhand der Jahreszahl in die entsprechenden Ordner verschoben werden.
Also eine Datei aus dem Jahr 2007 soll in den Ordner "2007" verschoben werden und wenn dieser nicht existiert, soll er angelegt werden.

Vielen lieben Dank schon vorab face-smile
bastla
bastla 25.06.2008 um 16:31:34 Uhr
Goto Top
Hallo BinderAlex!

Ich nehme an, die Frage
Aber da wir grad dabei sind, welche Zeile muss ich ändern, damit das Erstell-Jahr von Dateien unterhalb eines Verzeichnisses ausgelesen wird? face-wink
bezieht sich schon auf Problemchen #2 ...

... welches sich einen eigenen Thread verdient (falls Du nicht über die Forumssuche fündig wirst).

Grüße
bastla