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, 2118 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
Entwicklung
gelöst Dateiname auf bestimme Zeichenfolge überprüfen? (8)

Frage von matzetto zum Thema Entwicklung ...

Windows 10
gelöst Zeichenfolge in .reg Datei schreiben (Registry) (4)

Frage von MedicalAd zum Thema Windows 10 ...

Batch & Shell
gelöst Mal eine neue Art von Abfrage mit findstr (8)

Frage von DaTobsn zum Thema Batch & Shell ...

Microsoft Office
gelöst Excel Formeln - Zählen der Anzahl eindeutiger Zellwerte mit einer Nebenbedingung (4)

Frage von Booster07 zum Thema Microsoft Office ...

Neue Wissensbeiträge
Sicherheit

Millionen Euro in den Sand gesetzt?

(3)

Information von transocean zum Thema Sicherheit ...

Sicherheit

How I hacked hundreds of companies through their helpdesk

Information von SeaStorm zum Thema Sicherheit ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Eine Netzwerkdose im Wechsel für zwei unterschiedliche Netze (12)

Frage von kartoffelesser zum Thema LAN, WAN, Wireless ...

Netzwerke
Mobile Einwahl IPSec VPN von iPhone iPad T-Mobile zur Pfsense (12)

Frage von Spitzbube zum Thema Netzwerke ...

Voice over IP
SNOM D765 an LancomR883VAW (10)

Frage von MS6800 zum Thema Voice over IP ...

Windows Netzwerk
Ordner-Freigabe außerhalb der Domäne (9)

Frage von Remsboys zum Thema Windows Netzwerk ...