Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Eindeutige Zeichenfolgen mit findstr möglich?

Frage Entwicklung Batch & Shell

Mitglied: Sildorian

Sildorian (Level 1) - Jetzt verbinden

14.06.2012 um 12:06 Uhr, 2075 Aufrufe, 2 Kommentare

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.


01.
  
02.
@echo off 
03.
REM Datum und Uhrzeit werden festgelegt und der Sicherungsordner erstellt. 
04.
FOR /F "tokens=1-3 delims=/.- " %%A IN ('date /T') DO (SET TT=%%A&SET MM=%%B&SET JJJJ=%%C) 
05.
SET Datum=%JJJJ%.%MM%.%TT% 
06.
FOR /F "tokens=1-4 delims=:, " %%A IN ('time /T') DO (SET hh=%%A& SET mm=%%B& SET ss=%%C& SET ms=%%D) 
07.
SET Uhrzeit=%hh%.%mm%Uhr 
08.
SET Sicherungsordner=.\Sicherung\%Datum%\%Uhrzeit% 
09.
 
10.
REM Alle Betriebsnamen werden als si1.txt gespeichert. 
11.
dir /B /D ".\Daten" > si1.txt 
12.
 
13.
 
14.
:Betriebsauswahl 
15.
REM Der letzte Betrieb der si1.txt wird als Parameter ausgewählt. 
16.
SET loop=0 
17.
for %%R in (si1.txt) do if %%~zR equ 0 goto Ende 
18.
for /F "Tokens=*" %%i in (si1.txt) do Set betrieb=%%i 
19.
 
20.
REM Die Betriebsjahre des Betriebes werden als si2.txt gespeichert 
21.
dir /B /D ".\Daten\%betrieb%\" > si2.txt 
22.
 
23.
 
24.
 
25.
:Betriebsjahr 
26.
REM Die letzten beiden Ordner des Betriebes werden gesichert. 
27.
if %loop% geq 2 goto Betriebende 
28.
for /F "Tokens=*" %%i in (si2.txt) do Set betriebsjahr=%%i 
29.
 
30.
if not exist "%Sicherungsordner%\%betrieb%\%betriebsjahr%\" MD "%Sicherungsordner%\%betrieb%\%betriebsjahr%\" 
31.
xcopy ".\Daten\%betrieb%\%betriebsjahr%\*.*" "%Sicherungsordner%\%betrieb%\%betriebsjahr%\" /E /Y 
32.
for /f "delims=:" %%i in ('findstr /L /E /V "%betriebsjahr%" "si2.txt"') do echo %%i>>"si3.txt" 
33.
copy si3.txt si2.txt 
34.
del si3.txt 
35.
set /A loop=%loop%+1 
36.
goto Betriebsjahr 
37.
 
38.
 
39.
:Betriebende 
40.
REM 2 Unterordner wurden gesichert, weiter gehts mit dem nächsten. 
41.
for /f "delims=:" %%i in ('findstr /L /E /V "%betrieb%" "si1.txt"') do echo %%i>>"si3.txt" 
42.
copy si3.txt si1.txt 
43.
del si3.txt 
44.
goto Betriebsauswahl 
45.
 
46.
 
47.
:Ende 
48.
echo. 
49.
echo. 
50.
echo. 
51.
echo Alle Sicherungen abgeschlossen! 
52.
echo. 
53.
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

Mitglied: pieh-ejdsch
14.06.2012, aktualisiert um 13:48 Uhr
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?

01.
@echo off 
02.
setlocal 
03.
set "BetriebsDaten=.\Daten" 
04.
set /a LetzteJahre=2 
05.
 
06.
REM Datum und Uhrzeit werden festgelegt und der Sicherungsordner erstellt.  
07.
FOR /F "tokens=1-3 delims=/.- " %%A IN ('date /T') DO (SET TT=%%A&SET MM=%%B&SET JJJJ=%%C)  
08.
SET Datum=%JJJJ%.%MM%.%TT%  
09.
FOR /F "tokens=1-4 delims=:, " %%A IN ('time /T') DO (SET hh=%%A& SET mm=%%B& SET ss=%%C& SET ms=%%D)  
10.
SET Uhrzeit=%hh%.%mm%Uhr  
11.
SET Sicherungsordner=.\Sicherung\%Datum%\%Uhrzeit%  
12.
 
13.
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" 
14.
 
15.
echo. 
16.
echo. 
17.
echo. 
18.
echo Alle Sicherungen abgeschlossen! 
19.
echo. 
20.
pause 
21.
exit /b 0 
22.
 
23.
:Sicherung 
24.
echo Sichere "%~1\%~2" 
25.
xcopy "%~1\%~2\*.*" "%Sicherungsordner%\%~nx1\%~2\" /E /Y 
26.
 
27.
exit /b
Gruß Phil
Bitte warten ..
Mitglied: Sildorian
19.06.2012 um 10:08 Uhr
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! 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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Netzwerk
Kein RDP über VPN per MS-TSC möglich (8)

Frage von survial555 zum Thema Windows Netzwerk ...

Microsoft
Keine Anmeldung mehr möglich (Server 2012 R2) (4)

Frage von Shnuuu zum Thema Microsoft ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...