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
GELÖST

Call in For-Schleife - Irgenwie klappt das nicht

Frage Entwicklung Batch & Shell

Mitglied: Thror78

Thror78 (Level 1) - Jetzt verbinden

09.09.2010, aktualisiert 18.10.2012, 4538 Aufrufe, 6 Kommentare

Liebe Administrator-Gemeinde bisher konnten mir Eure Problemstellungen und deren Lösungen meistens weiterhelfen. Diesmal komme ich aber einfach nicht weiter. Ich raff das einfach nicht. Ich hoffe Ihr könnt mir weiterhelfen:

Ich schreibe ein Skript, mit welchem ich Backup-Verzeichnisse aufräumen möchte.
Ich möchte diverse Basisverzeichnisse durchlaufen, die in einem gemeinsamen Rootverzeichnis liegen.
In diesen Basisverzeichnissen liegen nun im Format DD.MM.YYYY Tagessicherungen herum. Wochentags +1 übers Wochenende/Feiertage entsprechend mehr. ist die Platte voll, können bestimmte Tagessicherungsordner auch leer sein.

Mit dem Skript möchte ich zunächst die leeren löschen und danach das aktuellste Verzeichnis stehen lassen und die anderen löschen.
Und das bei beliebig vielen Basisordnern.

Ich habe zunächst es versucht mit ineinander verschachtelten for-Schleifen. Da habe ich recherchiert, dass das nicht geht und bin da auf die CALL-Geschichte gestossen. Aber aus einer For-Schleife (durchwandern der Basisordner) heraus ein paar rein rudimentärer Funktionen mit Call aufzurufen schlägt grandios fehl!
Ich poste hier mal einen vereinfachten Code, mit dem ich mein Problem denke ich gut eingegrenzt habe:

01.
  
02.
@echo off & setlocal enabledelayedexpansion  
03.
SET col=Auswaehlen 
04.
goto All 
05.
 
06.
:BLAU 
07.
set col=blau 
08.
goto eof 
09.
 
10.
:GELB 
11.
set col=gelb 
12.
goto eof 
13.
 
14.
:ROT 
15.
set col=rot 
16.
goto eof 
17.
 
18.
:ALL 
19.
echo ---------- 
20.
for /L %%i in (1,1,10) do @( 
21.
	call:BLAU col 
22.
	echo %col% 
23.
	call:ROT col 
24.
	echo %col% 
25.
	call:BLAU col 
26.
	echo %col% 
27.
	call:GELB col 
28.
	echo %col% 
29.
30.
echo ---------- 
31.
pause 
32.
GOTO ALL 
33.
 
34.
:eof
Anstatt, dass nun 10x die Abfolge "blau", "rot", "blau", "gelb" angezeigt wird, wird stattdessen statt der Farbe "Auswaehlen" (so wie es bei der Initiierung festgelegt wurde) ausgegeben (also 4x10=40 Mal). Kommentiere ich nun die for Schleife und die dazugehörige schließende Klammer aus funktioniert es wie gewünscht:
blau
rot
blau
gelb
Könnt Ihr mir als Batch-Linkshänder einmal weiterhelfen? Warum funktioniert das nicht? Wie macht mans richtig?
Mitglied: bastla
09.09.2010 um 17:02 Uhr
Hallo Thror78 und willkommen im Forum!

Wenn Du schon "delayed Expansion" aktivierst, solltest Du es auch verwenden:
01.
@echo off & setlocal enabledelayedexpansion  
02.
SET col=Auswaehlen 
03.
goto :ALL 
04.
 
05.
:BLAU 
06.
set col=blau 
07.
goto :eof 
08.
 
09.
:GELB 
10.
set col=gelb 
11.
goto :eof 
12.
 
13.
:ROT 
14.
set col=rot 
15.
goto :eof 
16.
 
17.
:ALL 
18.
echo ---------- 
19.
for /L %%i in (1,1,10) do ( 
20.
	call:BLAU 
21.
	echo !col! 
22.
	call:ROT 
23.
	echo !col! 
24.
	call:BLAU 
25.
	echo !col! 
26.
	call:GELB 
27.
	echo !col! 
28.
29.
echo ---------- 
30.
pause 
31.
GOTO :ALL
Grüße
bastla
Bitte warten ..
Mitglied: Thror78
10.09.2010 um 07:41 Uhr
Wow war die Antwort schnell!
(Muste erstmal genau hinsehen, um die kleinen aber feinen Unterschiede überhaupt zu registrieren)
Den Unterschied zwischen den Variablenzugriffen via %sth% und !sth! war mir bisher nicht klar. Hab erst mit % dann mit ! probiert oder beides kombiniert. Ich glaub mit dem Thema werd ich mich noch etwas genauer auseinander setzen müssen. Wenn ich mit meinem Skript fertig bin poste ich das hier, falls jemand eine ähne Problestellung hat.

Erstmal vielen Dank bastla.
Bitte warten ..
Mitglied: Thror78
14.09.2010 um 16:16 Uhr
Hab meine Batch nun fast fertig. Funktioniert auch einwandfrei.
Nun habe ich aber mal die Testdaten abweichend vom Schema mit weiteren Testdaten ergänzt:
Ich habe in der Ordnerstruktur Ordner mit Leerzeichen eingefügt und da fliegt mir das Skript auf die Nase.

Hab das Forum schon durchsucht und Tante Google befragt, aber nicht passendes gefunden
Hier wieder ein kurzes Beispielskript, dass das Problem darstellt:

01.
@echo off & setlocal enabledelayedexpansion  
02.
SET "NewFolderName=Neuer Ordner Mit Verdammten Leerzeichen" 
03.
 
04.
if not exist !NewFolderName! ( 
05.
	md "!NewFolderName!" 
06.
	ping 1.1.1.1 -n 1 -w 2000 >NUL 
07.
08.
echo Hier wird der Ordner mit Leerzeichen angezeigt: 
09.
echo =================================================================== 
10.
dir /Ad /B 
11.
echo. 
12.
echo Hier wird der Ordnername nur bis zum ersten Leerzeichen ausgegeben: 
13.
echo =================================================================== 
14.
for /F %%b in ('dir /Ad /B') do ( 
15.
		set "CurrentFolder=%%b" 
16.
		echo !CurrentFolder! 
17.
18.
echo =================================================================== 
19.
 
20.
echo Wo ist denn nun der Ordner '!NewFolderName!'? 
21.
pause > Nul
Wäre Klasse wenn Ihr mir über diesen Stolperstein weiterhelfen könnt!

Gruß Thror
Bitte warten ..
Mitglied: bastla
14.09.2010 um 17:03 Uhr
Hallo Thror78!

Wenn Du Dir mit "for /?" die Hilfe zur "for"-Schleife ansiehst, wirst Du auch
Standardmäßig liefert /F den ersten, durch ein Leerzeichen getrennten Token von jeder Zeile
sowie
delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen die Standardtrennzeichen TAB und Leerzeichen.
finden.

Sollte das noch nicht genügen, überlege einfach, welches Trennzeichen Du verwenden möchtest - und wenn das Ergebnis "gar keines" lauten sollte, dann baue das entsprechend ein ...
Ansonsten noch ein anderer Hinweis: Die Variablenschreibweise mit "!Variablenname!" anstatt "%Variablenname%" ist nur erforderlich, wenn "delayed Expansion" benötigt wird - in Deinem Beispiel oben also nur innerhalb der Schleife (= in Zeile 16, wobei sich 15 und 16 in diesem Fall ja auch auf "echo %%b" reduzieren ließen, wodurch Du gänzlich auf "delayed Expansion" verzichten könntest) ...
Ach ja, bevor ich's vergesse (Du hast es nämlich schon ): In Zeile 4 fehlen Anführungszeichen ...

Grüße
bastla
Bitte warten ..
Mitglied: Thror78
15.09.2010 um 13:15 Uhr
Hey danke bastla! Hab ich entsprechend (s.u.) umgestellt und es funktioniert:

01.
for /F "delims=" %%b in ('dir /Ad /B') do ( 
02.
 echo %%b 
03.
)
Mit "Command /?" arbeite ich schon recht viel, bei der Anpassung auf den jeweiligen Anwendungsfall hapert es (!)noch(!).

Ich als Error-Tarzan habe mich mittlerweile zur nächsten Baustelle gehangelt. (Ich hoffe das ist jetzt erstmal die Letzte):

Ich lösche einzelne Ordner mit
01.
... 
02.
rmdir /S /Q "!CurrentPath!" 
03.
echo  "!CurrentPath!" ist gelöscht 
04.
pause 
05.
...
Ich möchte um absolut sicher zu gehen ermitteln, ob der Löschvorgang erfolgreich gewesen ist.
Mein Testscenario: Ich öffne eine enthaltene Word-Datei.
Nun hat eine Anwendung ein Handle (Zugriff) auf ein Objekt innerhalb der zu löschenden Ordnerstrukur. Dieses sorgt dafür das die Batch ...
... die Ordnerstruktur nicht löscht
... die Batch geschlossen wird. (Echo wird gar nicht mehr ausgeführt)

Hab schon versucht mit errorlevel zu arbeiten, die Anweisung in einen Call zu schieben, bzw. in eine externe Batch mit Call aufzurufen. In allen Fällen knaxt mir die Anwendungen weg.

Ich brauche eine Löschmethode die die Batch nicht zum Absturz bringt. Danach brauche ich die Info (am besten ErrorLevel) ob der Löschvorgang erfolgreich war oder nicht. Zur Not Frage ich noch mit " if exist ..." ab. Aber dafür darf sich die Batch nicht verabschieden!

Über die CMD-Console dagegen erhalte ich korrekt die Meldung:
"test1\Microsoft Office Word-Dokument (neu).docx - Der Prozess kann nicht auf die
Datei zugreifen, da sie von einem anderen Prozess verwendet wird."


Ich denke dieser Punkt ist nicht ganz so trivial, wie die meine letzten Fragen *hope*!

Gruß Thror78
Bitte warten ..
Mitglied: Thror78
15.09.2010, aktualisiert 18.10.2012
Damit man sich einen besseren Überblick verschaffen kann, was ich da genau mache, stelle ich mal die Batch rein. Hab extra ein wenig aufgeräumt! Im oberen Bereich sind einige Variablen konfigurierbar, um die Batch den jeweiligen Gegebenheiten anzupassen.

Evtl. findet Ihr ja noch den einen oder anderen Punkt, den man noch optimieren könnte. Bis auf den zuvor genannten Punkt geht es meines erachtens soweit.

01.
@echo off & setlocal enabledelayedexpansion  
02.
color F0 
03.
 
04.
REM Exemplarischer Aufbau der Dateistruktur 
05.
REM k:\  (z.B. externes Laufwerk) 
06.
REM    bkp2disk\CompanyName (CompanyName -Rootverzeichnis) 
07.
REM        Es folgen nun Basisverzeichnisse:                 
08.
REM                        \Firewall\... 
09.
REM                        \Mailsystem\... 
10.
REM                        \SAP\... 
11.
REM                        \Data\... 
12.
REM                        \VM_X\... 
13.
REM                        \VM_Y\... 
14.
REM 
15.
REM Unter diesen Basisverzeichnissen liegen nun in Ordnern mit Datumsangabe DD.MM.YYYY alle möglichen sicherungswürdigen Dateikomponente. 
16.
REM Ggf. leere Ordner sollen entfernt werden. Anschließend alle alten bis auf den aktuellsten Ordner entfernt werden 
17.
REM 
18.
REM 
19.
REM LEGENDE: 
20.
REM [V] Erfolgreich 
21.
REM [A] Aktueller Ordner 
22.
REM [D] Geloeschter Ordner 
23.
REM [!] Warnung oder Fehler 
24.
 
25.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
26.
 
27.
REM WaitWhenFinished: 1|0 - Wird auf 1 gesetzt wenn Fehler passiert 
28.
SET "WaitWhenFinished=0" 
29.
REM WaitSecondsWhenFinished: >=0 
30.
SET "WaitSecondsWhenFinished=20" 
31.
 
32.
SET "BackupDrive=k:" 
33.
SET "BackupRootPath=\bkp2disk\" 
34.
REM Volume heisst z.B. XYZ0015 - VolumeNamePattern wäre dann z.B. XYZ00 
35.
SET "VolumeNamePattern=CommonVolumeNamePart00" 
36.
 
37.
SET "LoggingPath=z:\CompanyName\Documentation\BackupCleanUpLogs" 
38.
SET "LoggingFileName=_BkpDrv_DRIVENAME_Cleaned_STATUS.log" 
39.
SET "SUCCESS=Success" 
40.
SET "WARNING=Warning" 
41.
SET "FAILURE=Failure" 
42.
 
43.
 
44.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
45.
REM AB HIER KEINE ÄNDERUNGEN MEHR VORNEHMEN!!! 
46.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
47.
SET "LogFileName=..." 
48.
SET "AtLeastOneError=0" 
49.
SET "AtLeastOneWarning=0" 
50.
 
51.
if not "!LoggingPath!" EQU "" ( 
52.
  FOR /F "tokens=1,2,3 delims=. " %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a 
53.
  set /a "TwoDigitYearMax=2038 %% 1000" 
54.
  REM if 1!yy! LSS 200 if 1!yy! LSS 1!TwoDigitYearMax! (set yy=20!yy!) else (set yy=19!yy!) 
55.
  SET yy=!yy: =! 
56.
  SET mm=!mm: =! 
57.
  SET dd=!dd: =! 
58.
  FOR /F "tokens=1,2,3 delims=: " %%s in ('echo %time%') do set hour=%%s & set min=%%t & set sec=%%u 
59.
  SET hour=!hour: =! 
60.
  SET min=!min: =! 
61.
  SET sec=!sec: =! 
62.
  set LogFileName=!yy!!mm!!dd!_!hour!!min!!sec!!LoggingFileName! 
63.
64.
CALL:LOGGING "" 
65.
CALL:LOGGING " Starte Bereinigungsvorgang des Backup-Laufwerks:" 
66.
CALL:LOGGING " ================================================" 
67.
CALL:LOGGING "" 
68.
GOTO CHECK_VOLUME_LETTER 
69.
 
70.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
71.
 
72.
:LOGGING 
73.
echo.%~1 
74.
if not "!LogFileName!" EQU "" ( 
75.
  echo.%~1 >> !LoggingPath!\!LogFileName! 
76.
77.
GOTO:EOF 
78.
 
79.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
80.
 
81.
:CHECK_VOLUME_LETTER 
82.
if not Exist %BackupDrive% @( 
83.
  GOTO ERROR_LaufwerkNichtgefunden 
84.
85.
CALL:LOGGING " [V] Laufwerkbuchstabe existiert." 
86.
%BackupDrive% 
87.
REM Ermittle VolumeNamen 
88.
for /f "tokens=1-5*" %%1 in ('vol') do ( 
89.
    set VolumeName=%%6 & GOTO CHECK_VOLUME_NAME 
90.
91.
 
92.
:CHECK_VOLUME_NAME 
93.
if defined VolumeNamePattern CALL set "s=%VolumeNamePattern%%%VolumeName:*%VolumeNamePattern%=%%" 
94.
if /i "%VolumeName%" NEQ "%s%" @( 
95.
	GOTO ERROR_LaufwerksnamePasstNicht 
96.
) else ( 
97.
  CALL:CHECK_VALID_DAY 
98.
  CALL:LOGGING " [V] Volumenbezeichnung entspricht dem angegebenen Muster!" 
99.
100.
if not Exist %BackupRootPath% @( 
101.
  GOTO ERROR_BackupRootPathNichtgefunden 
102.
103.
CALL:LOGGING " [V] Backup-Basispfad existiert." 
104.
CALL:LOGGING "" 
105.
cd %BackupRootPath% 
106.
GOTO:WALK_THROUGH_MAIN_FOLDERS 
107.
 
108.
:CHECK_VALID_DAY 
109.
REM START Source from: http://www.administrator.de/forum/wochentag-per-batch-ermitteln-80546.html 
110.
REM Hier eventuell Reihenfolge und delims anpassen 
111.
FOR /F "tokens=1,2,3 delims=." %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a 
112.
set /a "TwoDigitYearMax=2038%%1000" 
113.
if 1!yy! LSS 200 if 1!yy! LSS 1!TwoDigitYearMax! (set yy=20!yy!) else (set yy=19!yy!) 
114.
set /a dd=100!dd!%%100,mm=100!mm!%%100 
115.
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2 
116.
set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1 
117.
If !dow! equ 1 set "WoTa=Montag" 
118.
If !dow! equ 2 set "WoTa=Dienstag" 
119.
If !dow! equ 3 set "WoTa=Mittwoch" 
120.
If !dow! equ 4 set "WoTa=Donnerstag" 
121.
If !dow! equ 5 set "WoTa=Freitag" 
122.
If !dow! equ 6 set "WoTa=Samstag" 
123.
If !dow! equ 7 set "WoTa=Sonntag" 
124.
REM echo Heute ist ein !WoTa! 
125.
REM END Source from: http://www.administrator.de/forum/wochentag-per-batch-ermitteln-80546.html 
126.
SET VolumeNameNumber=%VolumeName:~5,1% 
127.
IF !VolumeNameNumber! GTR 4 ( 
128.
  REM Sicherungslaufwerk Sa&So existiert nicht. Bereinigung findet erwartungsgemaess am Mo statt 
129.
  SET /a VolumeNameNumber=1 
130.
) else ( 
131.
  REM Bereinigung der anderen Sicherungslaufwerken findet jeweils am folgenden Tag statt. 
132.
  SET /a VolumeNameNumber=!VolumeNameNumber!+1 
133.
134.
if not !dow! EQU !VolumeNameNumber! ( 
135.
  CALL:WARNING_CONTINUE_OR_NOT 
136.
137.
GOTO:EOF 
138.
 
139.
:WALK_THROUGH_MAIN_FOLDERS 
140.
	CALL:LOGGING "" 
141.
	CALL:LOGGING " Starte Bereinigung der einzelnen Backup-Ordner:" 
142.
	CALL:LOGGING " ===============================================" 
143.
	CALL:LOGGING "" 
144.
	for /F "delims=" %%a in ('dir /Ad /B') do ( 
145.
		set CurrentMainFolder=%%a 
146.
		CALL:LOGGING " Starte Bereinigung von '!CurrentMainFolder!' 
147.
		cd %%a 
148.
		CALL:WALK_THROUGH_SUB_FOLDERS  
149.
		cd .. 
150.
		CALL:LOGGING "" 
151.
152.
	if !AtLeastOneError! EQU 0 ( 
153.
		GOTO:SUCCESS 
154.
	) else ( 
155.
		GOTO:AT_LEAST_ONE_ERROR 
156.
157.
GOTO:EOF 
158.
 
159.
:WALK_THROUGH_SUB_FOLDERS 
160.
	set ErrorsOccoured=0 
161.
	REM [V] ToDo: geht nur bei Ordnernamen ohne Spaces!!! 
162.
	REM dir /Ad /B 
163.
	for /F "delims=" %%b in ('dir /Ad /B') do ( 
164.
		set CurrentFolder=%%b 
165.
		set CurrentPath=%BackupDrive%%BackupRootPath%\!CurrentMainFolder!\!CurrentFolder! 
166.
		cd %%b 
167.
		CALL:DELETE_FOLDER_IF_EMPTY  
168.
169.
	CALL:DELETE_ALL_BUT_NEWEST_FOLDER 
170.
	if !ErrorsOccoured! EQU 0 ( 
171.
		CALL:LOGGING " [V] '!CurrentMainFolder!' wurde oder ist bereinigt. 
172.
	) else ( 
173.
		CALL:LOGGING " [^^^!] '!CurrentMainFolder!' mit Fehlern abgeschlossen. 
174.
		set WaitWhenFinished=1 
175.
		set AtLeastOneError=1 
176.
177.
GOTO:EOF 
178.
 
179.
:DELETE_FOLDER_IF_EMPTY 
180.
	REM GET SIZE  
181.
	for /f "tokens=*" %%a in ( 'dir /w /s %1 ^| findstr "Datei(en)"') do ( 
182.
		set Size=%%a 
183.
184.
	REM Entferne alles außer dem 3. Eintrag, Dots, Spaces 
185.
	for /f "tokens=3 delims=, " %%g in ("%Size%") do set "Size=%%g"  
186.
	set Size=%Size:.=% 
187.
	set Size=%Size: =% 
188.
	cd .. 
189.
	REM Vor dem Loeschen wieder eine Ebene zurück gehen, damit Zugriffshandle auf den Ordner freigegeben wird und Loeschvorgang nicht verhindert 
190.
	if %Size% EQU 0 ( 
191.
		REM CALL deleteFile.bat "!CurrentPath!" 
192.
		REM Todo: Bei Vorhandem Zugriff auf Child-Elemente crashed die Batch 
193.
		rmdir /S /Q !CurrentPath! 
194.
		REM Baustelle 1 START 
195.
		if errorlevel 1 ( 
196.
			SET /a "ErrorsOccoured=1" 
197.
			CALL:ERROR_WHILE_DELETING_FOLDER 
198.
		) else ( 
199.
			CALL:LOGGING "    - Leeres Verzeichnis !CurrentFolder! wurde vernichtet." 
200.
201.
		REM Baustelle 1 ENDE 
202.
203.
GOTO:EOF 
204.
 
205.
:DELETE_ALL_BUT_NEWEST_FOLDER 
206.
	SET FolderCount=0 
207.
	SET NewestValidFolderSkipped=0 
208.
	FOR /F "DELIMS==" %%I IN ('DIR /Ad /B') DO SET /a FolderCount=!FolderCount!+1 
209.
	if NOT !FolderCount! LSS 2 ( 
210.
		for /f %%A in ('dir /Ad/D/B/O-d') do ( 
211.
			set Folder2Delete=%%A 
212.
			set Folder2Delete=!Folder2Delete: =! 
213.
			if not !Folder2Delete! EQU "" ( 
214.
				SET "FolderValid=1" 
215.
				CALL:CHECK_4_VALID_NAMING 
216.
				if !FolderValid! EQU 1 ( 
217.
					REM Ueberspringe den aktuellsten gueltigen Ordner und vernichte anschließend die restlichen gueltigen Ordner. 
218.
					if !NewestValidFolderSkipped! EQU 0 ( 
219.
						CALL:LOGGING "     [A] Das Verzeichnis !Folder2Delete! beinhaltet die aktuelle Sicherung^^^!" 
220.
						SET NewestValidFolderSkipped=1 
221.
					) else ( 
222.
						 
223.
						REM CALL deleteFile.bat "!CurrentPath!" 
224.
						REM Todo: Bei Vorhandem Zugriff auf Child-Elemente crashed die Batch 
225.
						rmdir /S /Q "!Folder2Delete!" 
226.
						REM Baustelle 2 START 
227.
						if errorlevel 1 ( 
228.
							SET /a "ErrorsOccoured=1" 
229.
							CALL:ERROR_WHILE_DELETING_FOLDER 
230.
						) else ( 
231.
							CALL:LOGGING "     [D] Veraltetes Verzeichnis !Folder2Delete! wurde vernichtet." 
232.
233.
						REM Baustelle 2 ENDE 
234.
235.
				) else ( 
236.
					REM set ErrorsOccoured=1 
237.
					CALL:WARNING_NOT_CONFORM_WITH_NAMING_CONVENTION 
238.
239.
240.
241.
242.
GOTO:EOF 
243.
 
244.
:CHECK_4_VALID_NAMING 
245.
	SET "FolderValid=1" 
246.
	for /f "tokens=1-4 delims=." %%d in ("!Folder2Delete!") do ( 
247.
		SET NameDay=%%d 
248.
		SET NameMonth=%%e 
249.
		SET NameYear=%%f 
250.
251.
	if NOT %NameDay% GTR 0 SET /a FolderValid = FolderValid * 0 
252.
	if NOT %NameDay% LSS 32 SET /a FolderValid = FolderValid * 0 
253.
	if NOT %NameMonth% GTR 0 SET /a FolderValid = FolderValid * 0 
254.
	if NOT %NameMonth% LSS 13 SET /a FolderValid = FolderValid * 0 
255.
	if NOT %NameYear% GTR 2009 SET /a FolderValid = FolderValid * 0 
256.
	if NOT %NameYear% LSS 2020 SET /a FolderValid = FolderValid * 0 
257.
GOTO:EOF 
258.
 
259.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
260.
 
261.
:ERROR_LaufwerkNichtgefunden 
262.
	SET "AtLeastOneError=1" 
263.
	CALL:LOGGING "" 
264.
	CALL:LOGGING " [^^^!] FEHLER: Das Laufwerk '%BackupDrive%' wurde nicht gefunden." 
265.
	CALL:LOGGING "" 
266.
	CALL:LOGGING "     Ueberpruefen Sie, ob das Laufwerk korrekt angeschlossen ist und" 
267.
	CALL:LOGGING "     starten Sie die Batch erneut!" 
268.
	CALL:LOGGING "" 
269.
GOTO:END 
270.
 
271.
:ERROR_LaufwerksnamePasstNicht 
272.
	SET "AtLeastOneError=1" 
273.
	CALL:LOGGING "" 
274.
	CALL:LOGGING " [^^^!] FEHLER: Der Laufwerksname '%VolumeName%' passt nicht zu dem Muster %VolumeNamePattern%." 
275.
	CALL:LOGGING "" 
276.
	CALL:LOGGING "     Ueberpruefen Sie, ob es sich um das richtige Laufwerk handelt und wechseln" 
277.
	CALL:LOGGING "     Sie es ggf. aus. Handelt es sich doch um das richtige Laufwerk, passen Sie" 
278.
	CALL:LOGGING "     den Namen des Laufwerks gemaess Vorgabe an." 
279.
	CALL:LOGGING "     Starten Sie danach die Batch erneut^^^!" 
280.
	CALL:LOGGING "" 
281.
GOTO:END 
282.
 
283.
:ERROR_BackupRootPathNichtgefunden 
284.
	SET "AtLeastOneError=1" 
285.
	CALL:LOGGING "" 
286.
	CALL:LOGGING " [^^^!] FEHLER: Der Pfad '%BackupDrive%%BackupRootPath%' wurde nicht gefunden." 
287.
	CALL:LOGGING "" 
288.
	CALL:LOGGING "     Ueberpruefen Sie, ob auf dem verbundenen Laufwerk %BackupDrive% der ange-" 
289.
	CALL:LOGGING "     gebene Pfad existiert, passen Sie ggf. den Pfad im Konfigurationsbereich" 
290.
	CALL:LOGGING "     an und starten Sie die Batch erneut^^^!" 
291.
	CALL:LOGGING "" 
292.
GOTO:END 
293.
 
294.
:ERROR_WHILE_DELETING_FOLDER 
295.
	SET "AtLeastOneError=1" 
296.
	CALL:LOGGING "" 
297.
	CALL:LOGGING " [^^^!] FEHLER: Fehler beim Vernichten von einem Verzeichnis." 
298.
	CALL:LOGGING "" 
299.
	CALL:LOGGING "     Beim Vernichten des Verzeichnisses '!CurrentFolder!!Folder2Delete!'  
300.
	CALL:LOGGING "     ist ein Fehler aufgetreten. Bitte ueberpruefen Sie den Status des Ordners" 
301.
	CALL:LOGGING "     schließen alle Programme, die auf den Ordner oder seine Inhalte zugreifen" 
302.
	CALL:LOGGING "     und starten Sie die Batch erneut^^^!" 
303.
	CALL:LOGGING "" 
304.
GOTO:END 
305.
 
306.
 
307.
:WARNING_CONTINUE_OR_NOT 
308.
	SET "AtLeastOneWarning=1" 
309.
	CALL:LOGGING "" 
310.
	CALL:LOGGING " [?] WARNUNG:" 
311.
	CALL:LOGGING "" 
312.
	CALL:LOGGING "     Es wurde am heutigen !WoTa! das Laufwerk vom vorherigen Arbeitstag erwar-" 
313.
	CALL:LOGGING "     tet. Entweder ist ein falsches Sicherungslaufwerk verbunden worden, oder" 
314.
	CALL:LOGGING "     es ist nicht gewechselt worden." 
315.
	CALL:LOGGING "     Dies kann durch ggf. Feiertage, oder auch Saeumnis geschehen." 
316.
	CALL:LOGGING "" 
317.
	CHOICE /C:jn /T:30 /D:n /M "     Wollen Sie mit der Bereinigung fortfahren" 
318.
	if errorlevel 2 goto WARNING_CANCLED_BY_USER 
319.
	REM if errorlevel 1  
320.
	CALL:LOGGING "     - Benutzer entscheidet sich fuer Fortsetzung der Bereinigung^^^! 
321.
	CALL:LOGGING "" 
322.
GOTO:EOF 
323.
 
324.
:WARNING_NOT_CONFORM_WITH_NAMING_CONVENTION 
325.
	SET "AtLeastOneWarning=1" 
326.
	CALL:LOGGING "" 
327.
	CALL:LOGGING " [?] WARNUNG: Verzeichnis wird uebersprungen."" 
328.
	CALL:LOGGING "" 
329.
	CALL:LOGGING "     Das Verzeichnis !Folder2Delete! entspricht nicht dem Anlageschema." 
330.
	CALL:LOGGING "     Ueberpruefen Sie das Verzeichnis und korrigieren Sie es ggf." 
331.
	CALL:LOGGING "" 
332.
GOTO:EOF 
333.
 
334.
:WARNING_CANCLED_BY_USER 
335.
	SET "AtLeastOneWarning=1" 
336.
	CALL:LOGGING "" 
337.
	CALL:LOGGING " [?] WARNUNG: Abbruch durch Benutzer oder automatisch durch TimeOut:" 
338.
	CALL:LOGGING "" 
339.
	CALL:LOGGING "     Beheben Sie ggf. vorliegende Missstaende und starten Sie die Batch erneut^^^!" 
340.
	CALL:LOGGING "" 
341.
GOTO:END 
342.
 
343.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
344.
:AT_LEAST_ONE_ERROR 
345.
	CALL:LOGGING "" 
346.
	CALL:LOGGING " [?] Beim Bereinigen des Backup-Laufwerks sind Fehler aufgetreten." 
347.
	CALL:LOGGING "" 
348.
	CALL:LOGGING "     Ueberpruefen Sie die Fehlermeldungen und starten Sie die Batch erneut^^^!" 
349.
	CALL:LOGGING "" 
350.
GOTO:END 
351.
 
352.
:SUCCESS 
353.
	CALL:LOGGING "" 
354.
	CALL:LOGGING " [V] Bereinigen des Backup-Laufwerks erfolgreich^^^!" 
355.
	CALL:LOGGING "" 
356.
	CALL:LOGGING " Till next time..." 
357.
GOTO:END 
358.
 
359.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
360.
 
361.
:END 
362.
	IF not "!LogFileName!" EQU "" ( 
363.
		REM echo "ERRORS  : !AtLeastOneError!" 
364.
		REM echo "WARNUNGS: !AtLeastOneWarning!" 
365.
		IF "!AtLeastOneError!" EQU "0" ( 
366.
			IF "!AtLeastOneWarning!" EQU "0" ( 
367.
				SET NewLogFileName=!LogFileName:STATUS=%SUCCESS%! 
368.
			) else ( 
369.
				SET NewLogFileName=!LogFileName:STATUS=%WARNING%! 
370.
371.
		) else (  
372.
			SET NewLogFileName=!LogFileName:STATUS=%FAILURE%! 
373.
374.
		SET NewLogFileName=!NewLogFileName:DRIVENAME=%VolumeName%"! 
375.
		RENAME "!LoggingPath!\!LogFileName!" "!NewLogFileName!" 
376.
	)  
377.
	If %WaitWhenFinished% equ 1 pause 
378.
	If %WaitWhenFinished% equ 0 ( 
379.
		If %WaitSecondsWhenFinished% gtr 0 @( 
380.
			REM Hier bleibt nun wirklich echo stehen, da dies nur für den Consolenbetrachter relevant ist 
381.
			echo. 
382.
			echo Das Programm wird beendet in !WaitSecondsWhenFinished! Sekunden! 
383.
			set CountDown=!WaitSecondsWhenFinished! 
384.
			for /L %%i in (1,1,!WaitSecondsWhenFinished!) do ( 
385.
				ping 1.1.1.1 -n 1 -w 1000 >NUL 
386.
				set /a CountDown=!CountDown!-1   
387.
388.
389.
390.
EXIT 
391.
REM !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i 
392.
 
393.
:EOF
Vielleicht hat ja jemand ebenfalls einen Verwendungszweck für dieses Skript.

Gruß Thror78
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...