manufactum
Goto Top

For R Such-Richtung umgekehrt?!

Hallo Admins,

ich habe mir ein Batch-Skript geschrieben, daß mit Drivesnapshot täglich Backups unseres Servers erstellt. Alle 7 Tage wird ein Vollbackup erstellt, dazwischen inkrementelle. Das Skript löscht automatisch nach 14 Tagen die Backups der vorletzten Woche.

Um die inkrementellen Backups immer vom aktuellsten Vollbackup zu erstellen soll es sich jeweils das aktuellste Hashfile dazu aus den Base-Ordnern suchen.

Ordnerstruktur:

server2_C\
2010-01-31-base
2010-02-01
2010-02-02
2010-02-03
2010-02-04
2010-02-05
2010-02-06
2010-02-07-base
2010-02-08
usw. max 14

Diese Zeile hat dafür bisher immer wunderbar funktioniert:

for /R "%SnapshotsBaseDir%\server2_%vol1%" %%f in (full.hsh*) do set LastHashFile=%%f

echo Gewähltes Hashfile: %LastHashFile% >"c:\skripte\test.log"

Seit neuestem durchsucht das Skript aber reproduzierbar den Ordner nicht mehr aufsteigend, sondern absteigend. D.h. die Varibale "LastHashFile" hat als Inhalt zuletzt das ältere Hashfile.

Auf einem anderen Rechner, in einer Testumgebung, funktioniert die Zeile tadellos...

Meine Fragen nun: Woher kommt die Suchrichtungsänderung? Und wie ändere ich die wieder?

Vielen Dank für Eure Hilfe!!

Content-Key: 135409

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

Printed on: April 25, 2024 at 04:04 o'clock

Member: Biber
Biber Feb 08, 2010 at 09:49:26 (UTC)
Goto Top
Moin manufactum,

willkommen im Forum.
Die FOR /R-Anweisung durchsucht meines Wissens zwar rekursiv einen Verzeichnisbaum, aber nicht in einer gewährleisteten Reihenfolge.
Wenn es also vorher "eigentlich immer" gepasst hat... Zufall, Schicksal, aber auf jeden Fall nicht einklagbar.

Ich sehe zwei (oder gar drei) Strategien, wie du dein Ziel erreichen kannst, je nach vorliegenden Rahmenbedingungen:

  • falls die Ordner jeweils direkt bei der Sicherung/am tag der Sicherung angelegt werden, dann kannst du das Alter (bzw. die Reihenfolge der Ordner) aus dem "DIR /TC -Erstellungsdatum ermitteln. Wenn denn im jüngsten Ordner auch das jüngste Hash-File ist

  • wenn das Anlegen der Ordner NICHT jeweils am Tag der Sicherung erfolgt, aber die Namenskonvention wie oben durchgängig eingehalten wurde, dann kannst du auch aus den Dateinamen das älteste/jüngste Unterverzeichnis ermitteln- wieder gilt: wenn denn auch im jünsten Verzeichnis das gesuchte Hashfile ist.

  • falls das jüngste und gesuchte Hashfile "irgendwo" in dieser Struktur liegt und wirklich nur daran erkennbar ist, dass es halt das jüngste von allen ist......dann musst/kannst du dem FOR /R -die Wahl der Reihenfolge überlassen, denn dann musst du ja ohnehin vom ersten bis zum letzten gefundenen Hashfile vergleichen "Hat das ein Datum größer als das bisher bekannte Jüngste)

Falls es der Fall 3 ist -hashfile ist irgendwo- dann wäre noch wichtig zu wissen, wieviel zeitlicher Abstand zwischen den Datei-Datumswerten der hashfiles üblicherweise liegt. Per Batch-Datumsvergleich kannst du normalerweise nur auf Stunden/Minuten-Genauigkeit gehen,; wenn Sekunden relevant sind, dann sollte der Datumsverglich mit VBScript erfolgen.

Grüße
Biber
Member: manufactum
manufactum Feb 08, 2010 at 11:26:46 (UTC)
Goto Top
Hallo Biber,

danke für Deine Antwort.

Strategie Nr.1 erscheint mir am praktikabelsten. Habe das mal so versucht:

for /f "skip=7" %%i in ('dir /b /on /ad "%SnapshotsBaseDir%\server2_%vol1%\20*"') do for /R %%i %%f in (full.hsh*) do set LastHashFile=%%f

Beim "dir"-Befehl gibt es sicher mehrere mögliche Wege. Die Ordner sind alphabetisch geordnet und jeder Ordner wird bei der Sicherung durch das Skript erstellt.

Irgendwie klappt die Verknüpfung von "erst ordnen" dann "suchen und Variable festlegen" aber noch nicht. Weißt Du eine Lösung?

Vielen Dank für Vorschläge!!
Member: Biber
Biber Feb 08, 2010 at 11:46:21 (UTC)
Goto Top
Moin manufactum,

warum hast du denn den Ehrgeiz, diese 2 Befehle in eine zeile zu trümmern?

Der DIR-Befehl kennt auch einen Schalter /B wie /Billich.
Damit bekommst du - in Verbindung mit der Sortierung nach Namen oder Datum ) nur die Ordnernamen in der Verzeichnisebene "%SnapshotsBaseDir%\server2_%vol1%\20*" heraus (ohne Vorspann, ohne Summenzeile... einfach nur 11 Zeilen für 11 Ordner)
Kannst dir also das "skip=7" sparen.

Wenn du die Ausgabe dieser sortierten Liste mit einem FOR/F-Befehl durchläufst, dann gilt auch hie "Okay, ich merke mir jeden Ordnernamen mit "SET letzter=%%i".
Bei geschickter sortierung ist dann der letzte der Liste auch der ....jüngste/alphabetisch kleinste oder was immer du auswertest.

Und NUR in diesem gefundenen Ordner %letzter% brauchst du doch ein FOR/R- rekursives Durchwackeln machen... nicht in allen Ordnern.

Bitte versuche es erstmal anhand der Hinweise, auf die zwei Schritte umzustellen.
Sollte es klemmen... Hilfe steht hier immer bereit.

Grüße
Biber
Member: manufactum
manufactum Feb 08, 2010 at 13:17:31 (UTC)
Goto Top
Hallo Biber,

die gesuchten Hash-Dateien "full.hsh" befinden sich ausschließlich in den "*-base"-Ordnern.

for /f %%i in ('dir /b /ad /on "%SnapshotsBaseDir%\server2_%vol1%\*-base"') do set letzter=%%i

set LastHashFile="%SnapshotsBaseDir%\server2_%vol1%\%letzter%\full.hsh"

So hat es jetzt funktioniert! Den "dir"-Befehl kann man vielleicht noch vereinfachen.

Danke Dir für Deine Hilfe.

Grüße
manufactum