Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

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, 2128 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 ..
Ähnliche Inhalte
Windows 10
gelöst Zeichenfolge in .reg Datei schreiben (Registry) (4)

Frage von MedicalAd zum Thema Windows 10 ...

Windows Tools
gelöst Findstr und regex (5)

Frage von tobmes zum Thema Windows Tools ...

Batch & Shell
Vergleich einer Zeichenfolge in zwei Dateinamen (3)

Frage von hongziehong zum Thema Batch & Shell ...

Windows Installation
Zu Win 10 PE Batch Befehle hinzufügen: findstr und wmic logicaldisk (2)

Frage von anmelder zum Thema Windows Installation ...

Neue Wissensbeiträge
Multimedia

Raspberry Pi als Digital-Signage-Computer

(1)

Information von BassFishFox zum Thema Multimedia ...

Windows Update

Novemberpatches und Nadeldrucker bereiten Kopfschmerzen

(15)

Tipp von MettGurke zum Thema Windows Update ...

Windows 10

Abhilfe für Abstürze von CDPUsersvc auf Win10 1607 und 2016 1607

(7)

Tipp von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Router & Routing
Freigabe aus anderem Netz nicht erreichbar (31)

Frage von McLion zum Thema Router & Routing ...

Visual Studio
Vb.net-Tool zum Erzeugen einer Outlook-E-Mail (24)

Frage von ahstax zum Thema Visual Studio ...

Batch & Shell
Batch Programm verhalten bei shoutdown -p (19)

Frage von Michael-ITler zum Thema Batch & Shell ...

Windows Netzwerk
Netzwerk Neustrukturierung (15)

Frage von IT-Dreamer zum Thema Windows Netzwerk ...