sildorian
Goto Top

Eindeutige Zeichenfolgen mit findstr möglich?

Hallo,

ich versuche gerade für einen Kunden eine Batch-Datei für die Datensicherung zu schreiben.


Situation:
In einem Ordner liegen mehrere Betriebs-Ordner, jeder Betrieb hat zudem einzelene Unterordner für jedes Jahr, als z.B.:

Ordner Betriebsdaten
- [133415132] Peter, Hans
--- 2010
--- 2011
--- 2012
- Hans Peter
--- 2008
--- 2009
--- 2010
- Ferdinant Mayer
--- 2011


Ziel:
Für jeden einzelnen Betrieb sollen nur die jeweils letzten beiden Betriebsjahre gesichert werden.


Mein Lösungsweg:
1. Alle Betriebe in einer Textdatei listen (si1.txt)
2. Den letzten Betrieb der Liste als Parameter 1 festlegen.
3. Alle Betriebsjahre dieses Betriebes als Textdatei listen (si2.txt)
4. Das letzte Jahr der Liste als Parameter 2 festlegen
5. Aus diesen beiden Parametern den zu sichernden Pfad erzeugen.
6. Das verwendete Betriebsjahr aus der Liste löschen und den Punkt 4 wiederholen, bis der Wert "2" erreicht ist.
7. Den verwendeten Betrieb aus der Liste löschen und den Punkt 2 wiederholen, bis alle Betriebe durch sind.


Das Problem:
Um den Betriebsnamen aus der Textdatei zu löschen, lasse ich über den Befehl "findstr" eine neue Textdatei erzeugen, die alles AUßER dem zuletzt verwendeten Betriebsnamen enthält.. ich habe aber bisher keine Möglichkeit gefunden, dass dabei wirklich NUR der Eintrag gelöscht wird, der EXAKT diesem Betriebsnamen entspricht. Soll heißen, aktuell würde nach der Bearbeitung von "[133415132] Peter, Hans" auch der Betrieb "Hans Peter" aus der Liste verschwinden.
Hier mal der gesamte Code in einer vereinfachten Form, um das ganze zu verdeutlichen.. das Problem tritt im Abschnitt "Betriebende" auf.


 
@echo off
REM Datum und Uhrzeit werden festgelegt und der Sicherungsordner erstellt.
FOR /F "tokens=1-3 delims=/.- " %%A IN ('date /T') DO (SET TT=%%A&SET MM=%%B&SET JJJJ=%%C)  
SET Datum=%JJJJ%.%MM%.%TT%
FOR /F "tokens=1-4 delims=:, " %%A IN ('time /T') DO (SET hh=%%A& SET mm=%%B& SET ss=%%C& SET ms=%%D)  
SET Uhrzeit=%hh%.%mm%Uhr
SET Sicherungsordner=.\Sicherung\%Datum%\%Uhrzeit%

REM Alle Betriebsnamen werden als si1.txt gespeichert.
dir /B /D ".\Daten" > si1.txt  


:Betriebsauswahl
REM Der letzte Betrieb der si1.txt wird als Parameter ausgewählt.
SET loop=0
for %%R in (si1.txt) do if %%~zR equ 0 goto Ende
for /F "Tokens=*" %%i in (si1.txt) do Set betrieb=%%i  

REM Die Betriebsjahre des Betriebes werden als si2.txt gespeichert
dir /B /D ".\Daten\%betrieb%\" > si2.txt  



:Betriebsjahr
REM Die letzten beiden Ordner des Betriebes werden gesichert.
if %loop% geq 2 goto Betriebende
for /F "Tokens=*" %%i in (si2.txt) do Set betriebsjahr=%%i  

if not exist "%Sicherungsordner%\%betrieb%\%betriebsjahr%\" MD "%Sicherungsordner%\%betrieb%\%betriebsjahr%\"  
xcopy ".\Daten\%betrieb%\%betriebsjahr%\*.*" "%Sicherungsordner%\%betrieb%\%betriebsjahr%\" /E /Y  
for /f "delims=:" %%i in ('findstr /L /E /V "%betriebsjahr%" "si2.txt"') do echo %%i>>"si3.txt"  
copy si3.txt si2.txt
del si3.txt
set /A loop=%loop%+1
goto Betriebsjahr


:Betriebende
REM 2 Unterordner wurden gesichert, weiter gehts mit dem nächsten.
for /f "delims=:" %%i in ('findstr /L /E /V "%betrieb%" "si1.txt"') do echo %%i>>"si3.txt"  
copy si3.txt si1.txt
del si3.txt
goto Betriebsauswahl


:Ende
echo.
echo.
echo.
echo Alle Sicherungen abgeschlossen!
echo.
pause


Es wäre super, wenn mir da jemand weiterhelfen könnte. Im Grunde fehlt mir nur eine Möglichkeit, bei "findstr" festzulegen, dass der Datensatz GENAU der Vorgabe entsprechen muss.

Grüße
- Sildorian

Content-Key: 186475

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

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

Member: pieh-ejdsch
pieh-ejdsch Jun 14, 2012 updated at 11:48:26 (UTC)
Goto Top
moin Sildorian,

irgendwie gehst Du das ganze von der Falschen Seite her an.

Eine Forschleife arbeitet doch schon eins nach dem anderen Ab und fängt auch von Vorne an.
Wieso also von Hinten mit 2 Listen anfangen, welche noch im Script erstellt werden?

@echo off
setlocal
set "BetriebsDaten=.\Daten"  
set /a LetzteJahre=2

REM Datum und Uhrzeit werden festgelegt und der Sicherungsordner erstellt. 
FOR /F "tokens=1-3 delims=/.- " %%A IN ('date /T') DO (SET TT=%%A&SET MM=%%B&SET JJJJ=%%C)   
SET Datum=%JJJJ%.%MM%.%TT% 
FOR /F "tokens=1-4 delims=:, " %%A IN ('time /T') DO (SET hh=%%A& SET mm=%%B& SET ss=%%C& SET ms=%%D)   
SET Uhrzeit=%hh%.%mm%Uhr 
SET Sicherungsordner=.\Sicherung\%Datum%\%Uhrzeit% 

for /d %%a in ("%BetriebsDaten%\*") do @set /a x=%LetzteJahre% &for /f delims^= %%b in ('dir /b /ad /o-d "%%a"' ) do @set /a y=1/x 2>nul && set /a x-=1 &&call :Sicherung "%%a" "%%b"  

echo.
echo.
echo.
echo Alle Sicherungen abgeschlossen!
echo.
pause
exit /b 0

:Sicherung
echo Sichere "%~1\%~2"  
xcopy "%~1\%~2\*.*" "%Sicherungsordner%\%~nx1\%~2\" /E /Y  

exit /b

Gruß Phil
Member: Sildorian
Sildorian Jun 19, 2012 at 08:08:33 (UTC)
Goto Top
Besten Dank Phil, das klappt ja super! Viel eleganter gelöst, ich war irgendwie der Ansicht, dass eine doppelte FOR-Schleife garnicht funktioniert und den Lösungsweg daher früh verworfen.. wieder was dazugelernt! face-smile Hab es noch fix auf die realen Bedingungen hier angepasst und schon hat es geflutscht ^^

Falls trotzdem noch jemand eine Antwort auf das ursprüngliche Problem mit der eindeutigen Zeichenreihenfolge im "findstr" hat, würde mich das schon sehr interessieren, aber dank Phils Lösung ist die eigentliche Aufgabe ja jetzt gelöst.

Grüße
- Sildorian