Datum aus Ordnernamen auslesen
Hallo zusammen,
hab' eine Datensicherung per Bachtdatei erstellt. Die Ordner, in denen die Daten gesichert werden, werden mit md %date% nach dem Tagesdatum benannt. Ist es nun möglich einen Ordnernamen wie 23.03.2008 einzulesen, sieben Tage zu addieren und einen neuen Ordnernamen aus dieser Addition zu erstellen, also 30.03.2008? Natürlich müsste man immer den zuletzt erstellten Ordner ermitteln und dessen Erstelldatum um 7 Tage erhöhen.
Ordner im Sicherungslaufwerk
09.03.2008
16.03.2008
23.03.2008
Der nächste Ordner würde also 30.03.2008 heißen. Wie geht das unter der cmd.exe?
Gruß
hab' eine Datensicherung per Bachtdatei erstellt. Die Ordner, in denen die Daten gesichert werden, werden mit md %date% nach dem Tagesdatum benannt. Ist es nun möglich einen Ordnernamen wie 23.03.2008 einzulesen, sieben Tage zu addieren und einen neuen Ordnernamen aus dieser Addition zu erstellen, also 30.03.2008? Natürlich müsste man immer den zuletzt erstellten Ordner ermitteln und dessen Erstelldatum um 7 Tage erhöhen.
Ordner im Sicherungslaufwerk
09.03.2008
16.03.2008
23.03.2008
Der nächste Ordner würde also 30.03.2008 heißen. Wie geht das unter der cmd.exe?
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 84300
Url: https://administrator.de/forum/datum-aus-ordnernamen-auslesen-84300.html
Ausgedruckt am: 10.04.2025 um 23:04 Uhr
16 Kommentare
Neuester Kommentar
Moin Exzel,
die Aufgabenstellung ist unklar bzw. nicht einleuchtend.
Bitte denk noch mal kurz über den Plan nach (ruhig hier im Forum).
Handwerklich ist es zwar (natürlich) machbar, aber...
Grüße
Biber
die Aufgabenstellung ist unklar bzw. nicht einleuchtend.
- wenn es sich um einen Sicherungsordner handelt (evtl. auch eine automatisierte Datensicherung per TaskPlaner?), dann sollte dieser Ordner das Tagesdatum bekommen. Dafür brauchst Du keine Addition.
- wenn Du das Datum aus den Namen der bereits vorhandenen Ordner ableiten willst, dann ist es sowohl für einen Programm-Algorithmus wie auch für die ganz normale Explorer-Namens-Sortier-Anzeige erschwerend, diesen Ordnern Namen wie "28.03.2008" zu geben. Da ist dann eine Namensgebung wie "20080328" sinnvoller und auch optisch sofort "richtig" vorhanden.
Bitte denk noch mal kurz über den Plan nach (ruhig hier im Forum).
Handwerklich ist es zwar (natürlich) machbar, aber...
Grüße
Biber
Moin Exzel,
dann gilt aber auch, dass das Datum des Sicherungsordner gleich dem aktuellen Datum sein sollte.
Wenn du am 1. April eine Sicherung startest, dann willst Du doch wohl nicht, dass ein doofer Batch nachschauen soll, von wann wohl die letzte Sicherung ist (Beispiel: gefunden wird "16.03.2008" oder auch "28.03.2008") und 7 Tage draufschlägt.
Oder fehlt mir noch irgendein Detail Deiner Anforderung?
Grüße
Biber
dann gilt aber auch, dass das Datum des Sicherungsordner gleich dem aktuellen Datum sein sollte.
Wenn du am 1. April eine Sicherung startest, dann willst Du doch wohl nicht, dass ein doofer Batch nachschauen soll, von wann wohl die letzte Sicherung ist (Beispiel: gefunden wird "16.03.2008" oder auch "28.03.2008") und 7 Tage draufschlägt.
Oder fehlt mir noch irgendein Detail Deiner Anforderung?
Grüße
Biber
Okay, in diesem Fall...
...dann würde ich als Kernstück der Prüfung eine Zeile temporäres VBSkript nehmen, nämlich (zum Testen):
-oder-
Du kannst also z.B. die (Pseudo-)Funktion ShowDaysSinceDate() im Batch so erzeugen und aufrufen:
[ungetestete Skizze]
Grüße
Biber
...dann würde ich als Kernstück der Prüfung eine Zeile temporäres VBSkript nehmen, nämlich (zum Testen):
' ---------snipp ShowDaysSinceDate.vbs
'liefert Anzahl Tage von Parameter1 "Datum" bis heute zurück heute
Wscript.echo datediff("d", wscript.arguments(0), date)
' ---------snipp IsOlderAWeek.vbs
' ---> liefert TRUE/Errorlevel 0 zurück, wenn Parameter1 "Datum" älter eine Woche
Wscript.quit(datediff("d", wscript.arguments(0), date)< 7)
Du kannst also z.B. die (Pseudo-)Funktion ShowDaysSinceDate() im Batch so erzeugen und aufrufen:
::----TestMyDaSi.bat
@echo off & setlocal
set "tempvbs=%temp%\ShowDaysSinceDate.vbs"
echo WScript.echo datediff("d", wscript.arguments(0), date)>"%tempvbs%"
:: Die vorhandenen DaSi-Ordnernamen einlesen sortiert nach Erzeugungsdatum; neuestes merken
For %%f %%i in ('dir /aD /o-d /b x:\DaSiRoot\??.??.????') do set "LastDaSiDir=%%~ni"
:: In %LastDaSiDir" sollte jetzt z.B. "28.03.2008" stehen
::
:: TempVBKrams aufrufen:
For /f %%i in ('cscript //nologo "%tempvbs%" %lastDaSiDir%') do set /a AnzTage=%%i
del "%tempvbs%"
::
:: wenn Anzahl Tage Größer gleich 7, dann neuen Ordner mit Tagesdatum anlegen.
If %AnzTage GEQ 7 md "x:\DaSiRoot\%date%"
:: .....hier kommt der eigentliche Sicherungszirkus...
Grüße
Biber
Hallo Exzel!
Eine Lösung in native Batch wäre vergleichsweise aufwändig, daher eine Variante mit (eingebettetem temporärem) VBS:
Wie schon von Biber angemerkt, ist die von Dir verwendete Datumsschreibweise für Sortierungszwecke nicht wirklich geeignet, daher wird hier das Änderungsdatum der Ordner zugrundegelegt und auf Basis dessen das Alter des jüngsten Ordners in Tagen ermittelt.
Mit der skizzierten Abfrage nach >= 7 Tagen ("greater or equal") kannst Du dann, wenn erforderlich, die nächste Sicherung ausführen lassen.
Grüße
bastla
[Edit]@Biber: Na da hab' ich ja wieder ewig gebraucht - liegt sicher an der Sommerzeit, wenn Du mich an einem Montag derart abhängst ...
[/Edit]
Alles klar?
Jetzt ja - allerdings hat sich die Aufgabenstellung gewandelt in: "Stelle fest, ob seit der letzten Sicherung mindestens 7 Tage vergangen sind."Eine Lösung in native Batch wäre vergleichsweise aufwändig, daher eine Variante mit (eingebettetem temporärem) VBS:
@echo off & setlocal
set "Sich=D:\Sicherungen"
for /f "delims=" %%i in ('dir /b /ad /od "%Sich%"') do set "Zuletzt=%%i"
set DD=%temp%\DateDiff.vbs
echo WScript.Echo DateDiff("d",WScript.Arguments(0),Now)>%DD%
for /f %%i in ('cscript //nologo %DD% %Zuletzt%') do set /a Tage=%%i
echo Alter der letzten Sicherung: %Tage% Tage
if %Tage% geq 7 echo Sicherung erforderlich
Wie schon von Biber angemerkt, ist die von Dir verwendete Datumsschreibweise für Sortierungszwecke nicht wirklich geeignet, daher wird hier das Änderungsdatum der Ordner zugrundegelegt und auf Basis dessen das Alter des jüngsten Ordners in Tagen ermittelt.
Mit der skizzierten Abfrage nach >= 7 Tagen ("greater or equal") kannst Du dann, wenn erforderlich, die nächste Sicherung ausführen lassen.
Grüße
bastla
[Edit]@Biber: Na da hab' ich ja wieder ewig gebraucht - liegt sicher an der Sommerzeit, wenn Du mich an einem Montag derart abhängst ...
@bastla
das solltest Du gelassen sehen... andere Foren brauchen Monate für eine Lösung bei solchen Fragen.
Und hier gibts nach ein paar Stunden schon mehrere Alternativen.
Und hier wird sogar die rein handwerkliche Lösung erst dann gepostet, wenn alles versucht worden ist, zuerst das Konzeptionelle auf die richtige Schiene zu bringen.
Also - eigentlich sehe ich hier keinen Grund zur Bescheidenheit.
....obwohl.... besser werden können wir immer....
Grüße
Biber
Na da hab' ich ja wieder ewig gebraucht..
das solltest Du gelassen sehen... andere Foren brauchen Monate für eine Lösung bei solchen Fragen.
Und hier gibts nach ein paar Stunden schon mehrere Alternativen.
Und hier wird sogar die rein handwerkliche Lösung erst dann gepostet, wenn alles versucht worden ist, zuerst das Konzeptionelle auf die richtige Schiene zu bringen.
Also - eigentlich sehe ich hier keinen Grund zur Bescheidenheit.
....obwohl.... besser werden können wir immer....
Grüße
Biber
Hallo Exzel!
Anscheinend machen die "/" Probleme (insbesondere vor "nologo" sind zwei Stück davon erforderlich) ...
Hier nochmals Biber's Variante:
und meine Version (übrigens auch ein Batch, daher mit dem Typ ".bat" oder ".cmd" zu speichern):
Biber hat den Quellpfad durch Festlegung eines Suchmusters für das Namensformat mit "??.??.????" genauer angegeben, während ich mich darauf verlassen hatte, dass sich im Quellordner ohnehin nur Sicherungsordner befinden - ich habe das jetzt auch bei meinem Batch sicherheitshalber noch ergänzt.
Grüße
bastla
Anscheinend machen die "/" Probleme (insbesondere vor "nologo" sind zwei Stück davon erforderlich) ...
Hier nochmals Biber's Variante:
@echo on & setlocal
set "tempvbs=%temp%\ShowDaysSinceDate.vbs"
echo WScript.echo datediff("d", wscript.arguments(0), date)>"%tempvbs%"
:: Die vorhandenen DaSi-Ordnernamen einlesen sortiert nach Erzeugungsdatum; neuestes merken
For /f %%i in ('dir /aD /od /b D:\??.??.????') do set "LastDaSiDir=%%~ni"
:: In %LastDaSiDir" sollte jetzt z.B. "28.03.2008" stehen
::
:: TempVBKrams aufrufen:
For /f %%i in ('cscript //nologo "%tempvbs%" %lastDaSiDir%') do set /a AnzTage=%%i
del "%tempvbs%"
::
:: wenn Anzahl Tage Größer gleich 7, dann neuen Ordner mit Tagesdatum anlegen.
If %AnzTage GEQ 7 md "D:\%date%"
@echo off & setlocal
set "Sich=D:\??.??.????"
for /f "delims=" %%i in ('dir /b /ad /od "%Sich%"') do set "Zuletzt=%%i"
set DD=%temp%\DateDiff.vbs
echo WScript.Echo DateDiff("d",WScript.Arguments(0),Now)>%DD%
for /f %%i in ('cscript //nologo %DD% %Zuletzt%') do set /a Tage=%%i
echo Alter der letzten Sicherung: %Tage% Tage
if %Tage% geq 7 echo Sicherung erforderlich
Grüße
bastla
...ich hasse Montage.... 
Okay, ich habe zwar oben geschrieben "ungetestete Skizze", aber dass ich so viele Bugs auf so kleinem Raum untergebracht habe, das habe ich wirklich nicht angenommen.
Ein (ja offensichtlich leicht zu überlesender) Tippfehler steckt hier:
Wo allerdings bastla auch seinen Montag mit mir teilte war....
Ja, ja... sicherheitshalber. Bringt gar nichts - schadet eher durch Vorgaukelung überlegter Programmierung.
Bug 2) Wenn doch schon klar ist, dass sich mindestens ein Punkt im (Ordner-)Gesamt-Namen befindet - wie nennt M$ die auf den letzten Punkt folgende Zeichenfolge? Richtig: Extension. Und das vor dem letzten Punkt ist der Name.
Also kommt bei meinem "Hol mir den Namen des jüngsten "??.??.????"-Verzeichnisses" heraus:
Beim Verzeichnis "28.03.2008" als Name [%%~ni]:------------> [28.03]
Bug 3) Und es kann Montags immer schlimmer kommen: Auch ein eventuell vorhandenes Verzeichnis, das nur aus ein oder zwei Zeichen besteht entspricht der vermeintlichen Genauigkeit der Suchmaske "??.??.????".
Wenn also zufällig im "Sicherungs-Root", also bei Dir auf Laufwerk D:, zwei Verzeichnisse angelegt werden mit...
Der langen Schreibe kurzer Schluss:
Mit der Dateimaske "??.??.20??" unterstelle ich, dass Du mit den Datensicherungen jetzt anfängst, also 2008 oder so.
Und dass auch Du spätestens im Jahre 2100 keinen Wert mehr auf Archivierung Deiner Computerdaten legst.
Na ja, wahrscheinlich muss sich dann niemand von uns mehr mit M$-Programmen rumbalgen.
Weil M$ in 90 Jahren bestimmt Software zur Spracherkennung von Nicht-US-englischen Dialekten entwickelt hat..*ggg
..... ihre M$KB-Seiten übersetzen die ja jetzt schon....wohin auch immer....
Grüße und schönen Restmontag
Biber
Okay, ich habe zwar oben geschrieben "ungetestete Skizze", aber dass ich so viele Bugs auf so kleinem Raum untergebracht habe, das habe ich wirklich nicht angenommen.
Ein (ja offensichtlich leicht zu überlesender) Tippfehler steckt hier:
For %%f %%i in ('dir /aD ....
und sollte natürlich heißen.For /f %%i in ('dir /aD ...
Den Bug hat bastla stillschweigend geglättet.Wo allerdings bastla auch seinen Montag mit mir teilte war....
Biber hat den Quellpfad durch Festlegung eines Suchmusters für das Namensformat mit "??.??.????" genauer angegeben, während ich mich darauf verlassen hatte, dass sich im Quellordner ohnehin nur Sicherungsordner befinden - ich habe das jetzt auch bei meinem Batch sicherheitshalber noch ergänzt.
Ja, ja... sicherheitshalber. Bringt gar nichts - schadet eher durch Vorgaukelung überlegter Programmierung.
Bug 2) Wenn doch schon klar ist, dass sich mindestens ein Punkt im (Ordner-)Gesamt-Namen befindet - wie nennt M$ die auf den letzten Punkt folgende Zeichenfolge? Richtig: Extension. Und das vor dem letzten Punkt ist der Name.
Also kommt bei meinem "Hol mir den Namen des jüngsten "??.??.????"-Verzeichnisses" heraus:
Beim Verzeichnis "28.03.2008" als Name [%%~ni]:------------> [28.03]
Bug 3) Und es kann Montags immer schlimmer kommen: Auch ein eventuell vorhandenes Verzeichnis, das nur aus ein oder zwei Zeichen besteht entspricht der vermeintlichen Genauigkeit der Suchmaske "??.??.????".
Wenn also zufällig im "Sicherungs-Root", also bei Dir auf Laufwerk D:, zwei Verzeichnisse angelegt werden mit...
md zB
md x
dann erwische ich die auch mit einem 'dir /ad '??.??.????'.md x
Der langen Schreibe kurzer Schluss:
- Ersetze die buggybuggybuggy-Zeile
[STREICHE] For %%f %%i in ('dir /aD /o-d /b d:\??.??.????') do set "LastDaSiDir=%%~ni"
durch[SETZE] For /f %%i in ('dir /aD /o-d /b d:\??.??.20??') do set "LastDaSiDir=%%~nxi"
Mit der Dateimaske "??.??.20??" unterstelle ich, dass Du mit den Datensicherungen jetzt anfängst, also 2008 oder so.
Und dass auch Du spätestens im Jahre 2100 keinen Wert mehr auf Archivierung Deiner Computerdaten legst.
Na ja, wahrscheinlich muss sich dann niemand von uns mehr mit M$-Programmen rumbalgen.
Weil M$ in 90 Jahren bestimmt Software zur Spracherkennung von Nicht-US-englischen Dialekten entwickelt hat..*ggg
..... ihre M$KB-Seiten übersetzen die ja jetzt schon....wohin auch immer....
Grüße und schönen Restmontag
Biber
@Biber
Schade eigentlich - ich fand die Maske eine gute Idee (muss aber leider zugeben, dann auch nicht mehr getestet zu haben).
Den Bug 2) habe ich durch präventive Ungenauigkeit vermieden ...
Grüße
bastla
P.S.: Falls Du ein "-" vermisst - das habe ich ...
[Edit] Wie ich sehe, hattest Du noch eines vorrätig ... [/Edit]
Schade eigentlich - ich fand die Maske eine gute Idee (muss aber leider zugeben, dann auch nicht mehr getestet zu haben).
Den Bug 2) habe ich durch präventive Ungenauigkeit vermieden ...
Grüße
bastla
P.S.: Falls Du ein "-" vermisst - das habe ich ...
[Edit] Wie ich sehe, hattest Du noch eines vorrätig ... [/Edit]
Hallo Exzel!
Noch ein Versuch:
Sollte auch das nicht zum gewünschten Ergebnis führen, könntest Du einmal mit "Start / Ausführen..." und der Eingabe von "cmd" zur Kommandozeile gehen und dort den Befehl
ausführen. Der Laufwerksbuchstabe ist natürlich, so wie auch im Batch oben, anzupassen. 
Um das ausgegebene Inhaltsverzeichnis posten zu können, empfiehlt es sich, im CMD-Fenster auf die linke obere Ecke zu klicken, im erscheinenden Menü "Eigenschaften" zu wählen und dort im Register "Optionen" den "QuickEdit-Modus" zu aktivieren.
Nach "OK" und der Auswahl, die Eigenschaften "... für alle Fenster mit gleichem Namen" zu übernehmen, kannst Du bequem mit der Maus im CMD-Fenster kopieren und einfügen - dazu mit der linken Maustaste markieren und durch Rechtsklick kopieren (wenn nichts markiert ist, bewirkt ein Rechtsklick das Einfügen aus der Zwischenablage).
Kopiere bitte das gesamte Ergebnis des "dir"-Befehles und poste es zusammen mit der Ausgabe eines zweiten "dir"-Befehles, bei welchem Du das "/tc" weg und den Rest gleich lässt (mit der "Pfeil-nach-oben"-Taste kannst Du den vorigen Befehl nochmals aufrufen und auch vor dem erneuten Ausführen bearbeiten).
Grüße
bastla
Noch ein Versuch:
@echo off & setlocal
set "Sich=D:\??.??.20??"
for /f "delims=" %%i in ('dir /b /ad /od /tc "%Sich%"') do set "Zuletzt=%%i"
set DD=%temp%\DateDiff.vbs
echo WScript.Echo DateDiff("d",WScript.Arguments(0),Now)>%DD%
for /f %%i in ('cscript //nologo %DD% %Zuletzt%') do set /a Tage=%%i
echo Alter der letzten Sicherung: %Tage% Tage
if %Tage% geq 7 echo Sicherung erforderlich
Sollte auch das nicht zum gewünschten Ergebnis führen, könntest Du einmal mit "Start / Ausführen..." und der Eingabe von "cmd" zur Kommandozeile gehen und dort den Befehl
dir /od /tc D:\Sicherungen\??.??.20??
Um das ausgegebene Inhaltsverzeichnis posten zu können, empfiehlt es sich, im CMD-Fenster auf die linke obere Ecke zu klicken, im erscheinenden Menü "Eigenschaften" zu wählen und dort im Register "Optionen" den "QuickEdit-Modus" zu aktivieren.
Nach "OK" und der Auswahl, die Eigenschaften "... für alle Fenster mit gleichem Namen" zu übernehmen, kannst Du bequem mit der Maus im CMD-Fenster kopieren und einfügen - dazu mit der linken Maustaste markieren und durch Rechtsklick kopieren (wenn nichts markiert ist, bewirkt ein Rechtsklick das Einfügen aus der Zwischenablage).
Kopiere bitte das gesamte Ergebnis des "dir"-Befehles und poste es zusammen mit der Ausgabe eines zweiten "dir"-Befehles, bei welchem Du das "/tc" weg und den Rest gleich lässt (mit der "Pfeil-nach-oben"-Taste kannst Du den vorigen Befehl nochmals aufrufen und auch vor dem erneuten Ausführen bearbeiten).
Grüße
bastla
Hallo Exzel!
Wie Du an der Auflistung erkennen kannst, gilt auf Basis der Sortierung nach Erstellungs- und auch nach Änderungsdatum der Ordner "15.02.2008" als der neueste - daher wäre eine Sortierung nach dem Namen vorzuziehen, was sich am sinnvollsten über die Änderung der Datumsschreibweise erreichen lässt.
Dazu müsstest Du Dein
zB ersetzen durch
Als Ziel der Sicherung kannst Du dann ebenfalls "D:\%Datum%" angeben. Das resultierende Format wäre dann zB "2008-04-07".
Der Batch zur Auswertung:
Grüße
bastla
Wie Du an der Auflistung erkennen kannst, gilt auf Basis der Sortierung nach Erstellungs- und auch nach Änderungsdatum der Ordner "15.02.2008" als der neueste - daher wäre eine Sortierung nach dem Namen vorzuziehen, was sich am sinnvollsten über die Änderung der Datumsschreibweise erreichen lässt.
Dazu müsstest Du Dein
md %date%
set "Datum=%date:~-4%-%date:~-7,2%-%date:~-10,2%"
"md D:\%Datum%"
Der Batch zur Auswertung:
@echo off & setlocal
set "Sich=D:\20??-??-*"
for /f "tokens=1-3 delims=-" %%i in ('dir /b /ad /on "%Sich%"') do set "Zuletzt=%%k.%%j.%%i"
set DD=%temp%\DateDiff.vbs
echo WScript.Echo DateDiff("d",WScript.Arguments(0),Now)>%DD%
for /f %%i in ('cscript //nologo %DD% %Zuletzt%') do set /a Tage=%%i
echo Alter der letzten Sicherung: %Tage% Tage
if %Tage% geq 7 echo Sicherung erforderlich
Grüße
bastla