thror78
Goto Top

Call in For-Schleife - Irgenwie klappt das nicht

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:

 
@echo off & setlocal enabledelayedexpansion 
SET col=Auswaehlen
goto All

:BLAU
set col=blau
goto eof

:GELB
set col=gelb
goto eof

:ROT
set col=rot
goto eof

:ALL
echo ----------
for /L %%i in (1,1,10) do @(
	call:BLAU col
	echo %col%
	call:ROT col
	echo %col%
	call:BLAU col
	echo %col%
	call:GELB col
	echo %col%
)
echo ----------
pause
GOTO ALL

: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?

Content-Key: 150742

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

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

Member: bastla
bastla Sep 09, 2010 at 15:02:19 (UTC)
Goto Top
Hallo Thror78 und willkommen im Forum!

Wenn Du schon "delayed Expansion" aktivierst, solltest Du es auch verwenden:
@echo off & setlocal enabledelayedexpansion 
SET col=Auswaehlen
goto :ALL

:BLAU
set col=blau
goto :eof

:GELB
set col=gelb
goto :eof

:ROT
set col=rot
goto :eof

:ALL
echo ----------
for /L %%i in (1,1,10) do (
	call:BLAU
	echo !col!
	call:ROT
	echo !col!
	call:BLAU
	echo !col!
	call:GELB
	echo !col!
)
echo ----------
pause
GOTO :ALL
Grüße
bastla
Member: Thror78
Thror78 Sep 10, 2010 at 05:41:16 (UTC)
Goto Top
Wow war die Antwort schnell! face-big-smile
(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.
Member: Thror78
Thror78 Sep 14, 2010 at 14:16:31 (UTC)
Goto Top
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:

@echo off & setlocal enabledelayedexpansion 
SET "NewFolderName=Neuer Ordner Mit Verdammten Leerzeichen"  

if not exist !NewFolderName! (
	md "!NewFolderName!"  
	ping 1.1.1.1 -n 1 -w 2000 >NUL
)
echo Hier wird der Ordner mit Leerzeichen angezeigt:
echo ===================================================================
dir /Ad /B
echo.
echo Hier wird der Ordnername nur bis zum ersten Leerzeichen ausgegeben:
echo ===================================================================
for /F %%b in ('dir /Ad /B') do (  
		set "CurrentFolder=%%b"  
		echo !CurrentFolder!
)
echo ===================================================================

echo Wo ist denn nun der Ordner '!NewFolderName!'?  
pause > Nul

Wäre Klasse wenn Ihr mir über diesen Stolperstein weiterhelfen könnt!

Gruß Thror
Member: bastla
bastla Sep 14, 2010 at 15:03:17 (UTC)
Goto Top
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 face-wink): In Zeile 4 fehlen Anführungszeichen ...

Grüße
bastla
Member: Thror78
Thror78 Sep 15, 2010 at 11:15:08 (UTC)
Goto Top
Hey danke bastla! Hab ich entsprechend (s.u.) umgestellt und es funktioniert:

for /F "delims=" %%b in ('dir /Ad /B') do (  
 echo %%b
)

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
...
rmdir /S /Q "!CurrentPath!"  
echo  "!CurrentPath!" ist gelöscht  
pause
...

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
Member: Thror78
Thror78 Sep 15, 2010, updated at Oct 18, 2012 at 16:43:29 (UTC)
Goto Top
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.

@echo off & setlocal enabledelayedexpansion 
color F0

REM Exemplarischer Aufbau der Dateistruktur
REM k:\  (z.B. externes Laufwerk)
REM    bkp2disk\CompanyName (CompanyName -Rootverzeichnis)
REM        Es folgen nun Basisverzeichnisse:                
REM                        \Firewall\...
REM                        \Mailsystem\...
REM                        \SAP\...
REM                        \Data\...
REM                        \VM_X\...
REM                        \VM_Y\...
REM
REM Unter diesen Basisverzeichnissen liegen nun in Ordnern mit Datumsangabe DD.MM.YYYY alle möglichen sicherungswürdigen Dateikomponente.
REM Ggf. leere Ordner sollen entfernt werden. Anschließend alle alten bis auf den aktuellsten Ordner entfernt werden
REM
REM
REM LEGENDE:
REM [V] Erfolgreich
REM [A] Aktueller Ordner
REM [D] Geloeschter Ordner
REM [!] Warnung oder Fehler

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

REM WaitWhenFinished: 1|0 - Wird auf 1 gesetzt wenn Fehler passiert
SET "WaitWhenFinished=0"  
REM WaitSecondsWhenFinished: >=0
SET "WaitSecondsWhenFinished=20"  

SET "BackupDrive=k:"  
SET "BackupRootPath=\bkp2disk\"  
REM Volume heisst z.B. XYZ0015 - VolumeNamePattern wäre dann z.B. XYZ00
SET "VolumeNamePattern=CommonVolumeNamePart00"  

SET "LoggingPath=z:\CompanyName\Documentation\BackupCleanUpLogs"  
SET "LoggingFileName=_BkpDrv_DRIVENAME_Cleaned_STATUS.log"  
SET "SUCCESS=Success"  
SET "WARNING=Warning"  
SET "FAILURE=Failure"  


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
REM AB HIER KEINE ÄNDERUNGEN MEHR VORNEHMEN!!!
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
SET "LogFileName=..."  
SET "AtLeastOneError=0"  
SET "AtLeastOneWarning=0"  

if not "!LoggingPath!" EQU "" (  
  FOR /F "tokens=1,2,3 delims=. " %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a  
  set /a "TwoDigitYearMax=2038 %% 1000"  
  REM if 1!yy! LSS 200 if 1!yy! LSS 1!TwoDigitYearMax! (set yy=20!yy!) else (set yy=19!yy!)
  SET yy=!yy: =!
  SET mm=!mm: =!
  SET dd=!dd: =!
  FOR /F "tokens=1,2,3 delims=: " %%s in ('echo %time%') do set hour=%%s & set min=%%t & set sec=%%u  
  SET hour=!hour: =!
  SET min=!min: =!
  SET sec=!sec: =!
  set LogFileName=!yy!!mm!!dd!_!hour!!min!!sec!!LoggingFileName!
)
CALL:LOGGING ""  
CALL:LOGGING " Starte Bereinigungsvorgang des Backup-Laufwerks:"  
CALL:LOGGING " ================================================"  
CALL:LOGGING ""  
GOTO CHECK_VOLUME_LETTER

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

:LOGGING
echo.%~1
if not "!LogFileName!" EQU "" (  
  echo.%~1 >> !LoggingPath!\!LogFileName!
)
GOTO:EOF

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

:CHECK_VOLUME_LETTER
if not Exist %BackupDrive% @(
  GOTO ERROR_LaufwerkNichtgefunden
)
CALL:LOGGING " [V] Laufwerkbuchstabe existiert."  
%BackupDrive%
REM Ermittle VolumeNamen
for /f "tokens=1-5*" %%1 in ('vol') do (  
    set VolumeName=%%6 & GOTO CHECK_VOLUME_NAME
)

:CHECK_VOLUME_NAME
if defined VolumeNamePattern CALL set "s=%VolumeNamePattern%%%VolumeName:*%VolumeNamePattern%=%%"  
if /i "%VolumeName%" NEQ "%s%" @(  
	GOTO ERROR_LaufwerksnamePasstNicht
) else (
  CALL:CHECK_VALID_DAY
  CALL:LOGGING " [V] Volumenbezeichnung entspricht dem angegebenen Muster!"  
)
if not Exist %BackupRootPath% @(
  GOTO ERROR_BackupRootPathNichtgefunden
)
CALL:LOGGING " [V] Backup-Basispfad existiert."  
CALL:LOGGING ""  
cd %BackupRootPath%
GOTO:WALK_THROUGH_MAIN_FOLDERS

:CHECK_VALID_DAY
REM START Source from: [content:80546]
REM Hier eventuell Reihenfolge und delims anpassen
FOR /F "tokens=1,2,3 delims=." %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a  
set /a "TwoDigitYearMax=2038%%1000"  
if 1!yy! LSS 200 if 1!yy! LSS 1!TwoDigitYearMax! (set yy=20!yy!) else (set yy=19!yy!)
set /a dd=100!dd!%%100,mm=100!mm!%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2
set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1
If !dow! equ 1 set "WoTa=Montag"  
If !dow! equ 2 set "WoTa=Dienstag"  
If !dow! equ 3 set "WoTa=Mittwoch"  
If !dow! equ 4 set "WoTa=Donnerstag"  
If !dow! equ 5 set "WoTa=Freitag"  
If !dow! equ 6 set "WoTa=Samstag"  
If !dow! equ 7 set "WoTa=Sonntag"  
REM echo Heute ist ein !WoTa!
REM END Source from: [content:80546]
SET VolumeNameNumber=%VolumeName:~5,1%
IF !VolumeNameNumber! GTR 4 (
  REM Sicherungslaufwerk Sa&So existiert nicht. Bereinigung findet erwartungsgemaess am Mo statt
  SET /a VolumeNameNumber=1
) else (
  REM Bereinigung der anderen Sicherungslaufwerken findet jeweils am folgenden Tag statt.
  SET /a VolumeNameNumber=!VolumeNameNumber!+1
)
if not !dow! EQU !VolumeNameNumber! (
  CALL:WARNING_CONTINUE_OR_NOT
)
GOTO:EOF

:WALK_THROUGH_MAIN_FOLDERS
	CALL:LOGGING ""  
	CALL:LOGGING " Starte Bereinigung der einzelnen Backup-Ordner:"  
	CALL:LOGGING " ==============================================="  
	CALL:LOGGING ""  
	for /F "delims=" %%a in ('dir /Ad /B') do (  
		set CurrentMainFolder=%%a
		CALL:LOGGING " Starte Bereinigung von '!CurrentMainFolder!'  
		cd %%a
		CALL:WALK_THROUGH_SUB_FOLDERS 
		cd ..
		CALL:LOGGING ""  
	)
	if !AtLeastOneError! EQU 0 (
		GOTO:SUCCESS
	) else (
		GOTO:AT_LEAST_ONE_ERROR
	)
GOTO:EOF

:WALK_THROUGH_SUB_FOLDERS
	set ErrorsOccoured=0
	REM [V] ToDo: geht nur bei Ordnernamen ohne Spaces!!!
	REM dir /Ad /B
	for /F "delims=" %%b in ('dir /Ad /B') do (  
		set CurrentFolder=%%b
		set CurrentPath=%BackupDrive%%BackupRootPath%\!CurrentMainFolder!\!CurrentFolder!
		cd %%b
		CALL:DELETE_FOLDER_IF_EMPTY 
	)
	CALL:DELETE_ALL_BUT_NEWEST_FOLDER
	if !ErrorsOccoured! EQU 0 (
		CALL:LOGGING " [V] '!CurrentMainFolder!' wurde oder ist bereinigt.  
	) else (
		CALL:LOGGING " [^^^!] '!CurrentMainFolder!' mit Fehlern abgeschlossen.  
		set WaitWhenFinished=1
		set AtLeastOneError=1
	)
GOTO:EOF

:DELETE_FOLDER_IF_EMPTY
	REM GET SIZE 
	for /f "tokens=*" %%a in ( 'dir /w /s %1 ^| findstr "Datei(en)"') do (  
		set Size=%%a
	)
	REM Entferne alles außer dem 3. Eintrag, Dots, Spaces
	for /f "tokens=3 delims=, " %%g in ("%Size%") do set "Size=%%g"   
	set Size=%Size:.=%
	set Size=%Size: =%
	cd ..
	REM Vor dem Loeschen wieder eine Ebene zurück gehen, damit Zugriffshandle auf den Ordner freigegeben wird und Loeschvorgang nicht verhindert
	if %Size% EQU 0 (
		REM CALL deleteFile.bat "!CurrentPath!"  
		REM Todo: Bei Vorhandem Zugriff auf Child-Elemente crashed die Batch
		rmdir /S /Q !CurrentPath!
		REM Baustelle 1 START
		if errorlevel 1 (
			SET /a "ErrorsOccoured=1"  
			CALL:ERROR_WHILE_DELETING_FOLDER
		) else (
			CALL:LOGGING "    - Leeres Verzeichnis !CurrentFolder! wurde vernichtet."  
		)
		REM Baustelle 1 ENDE
	)
GOTO:EOF

:DELETE_ALL_BUT_NEWEST_FOLDER
	SET FolderCount=0
	SET NewestValidFolderSkipped=0
	FOR /F "DELIMS==" %%I IN ('DIR /Ad /B') DO SET /a FolderCount=!FolderCount!+1  
	if NOT !FolderCount! LSS 2 (
		for /f %%A in ('dir /Ad/D/B/O-d') do (  
			set Folder2Delete=%%A
			set Folder2Delete=!Folder2Delete: =!
			if not !Folder2Delete! EQU "" (  
				SET "FolderValid=1"  
				CALL:CHECK_4_VALID_NAMING
				if !FolderValid! EQU 1 (
					REM Ueberspringe den aktuellsten gueltigen Ordner und vernichte anschließend die restlichen gueltigen Ordner.
					if !NewestValidFolderSkipped! EQU 0 (
						CALL:LOGGING "     [A] Das Verzeichnis !Folder2Delete! beinhaltet die aktuelle Sicherung^^^!"  
						SET NewestValidFolderSkipped=1
					) else (
						
						REM CALL deleteFile.bat "!CurrentPath!"  
						REM Todo: Bei Vorhandem Zugriff auf Child-Elemente crashed die Batch
						rmdir /S /Q "!Folder2Delete!"  
						REM Baustelle 2 START
						if errorlevel 1 (
							SET /a "ErrorsOccoured=1"  
							CALL:ERROR_WHILE_DELETING_FOLDER
						) else (
							CALL:LOGGING "     [D] Veraltetes Verzeichnis !Folder2Delete! wurde vernichtet."  
						)
						REM Baustelle 2 ENDE
					)
				) else (
					REM set ErrorsOccoured=1
					CALL:WARNING_NOT_CONFORM_WITH_NAMING_CONVENTION
				)
			)
		)
	)
GOTO:EOF

:CHECK_4_VALID_NAMING
	SET "FolderValid=1"  
	for /f "tokens=1-4 delims=." %%d in ("!Folder2Delete!") do (  
		SET NameDay=%%d
		SET NameMonth=%%e
		SET NameYear=%%f
	)
	if NOT %NameDay% GTR 0 SET /a FolderValid = FolderValid * 0
	if NOT %NameDay% LSS 32 SET /a FolderValid = FolderValid * 0
	if NOT %NameMonth% GTR 0 SET /a FolderValid = FolderValid * 0
	if NOT %NameMonth% LSS 13 SET /a FolderValid = FolderValid * 0
	if NOT %NameYear% GTR 2009 SET /a FolderValid = FolderValid * 0
	if NOT %NameYear% LSS 2020 SET /a FolderValid = FolderValid * 0
GOTO:EOF

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

:ERROR_LaufwerkNichtgefunden
	SET "AtLeastOneError=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [^^^!] FEHLER: Das Laufwerk '%BackupDrive%' wurde nicht gefunden."  
	CALL:LOGGING ""  
	CALL:LOGGING "     Ueberpruefen Sie, ob das Laufwerk korrekt angeschlossen ist und"  
	CALL:LOGGING "     starten Sie die Batch erneut!"  
	CALL:LOGGING ""  
GOTO:END

:ERROR_LaufwerksnamePasstNicht
	SET "AtLeastOneError=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [^^^!] FEHLER: Der Laufwerksname '%VolumeName%' passt nicht zu dem Muster %VolumeNamePattern%."  
	CALL:LOGGING ""  
	CALL:LOGGING "     Ueberpruefen Sie, ob es sich um das richtige Laufwerk handelt und wechseln"  
	CALL:LOGGING "     Sie es ggf. aus. Handelt es sich doch um das richtige Laufwerk, passen Sie"  
	CALL:LOGGING "     den Namen des Laufwerks gemaess Vorgabe an."  
	CALL:LOGGING "     Starten Sie danach die Batch erneut^^^!"  
	CALL:LOGGING ""  
GOTO:END

:ERROR_BackupRootPathNichtgefunden
	SET "AtLeastOneError=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [^^^!] FEHLER: Der Pfad '%BackupDrive%%BackupRootPath%' wurde nicht gefunden."  
	CALL:LOGGING ""  
	CALL:LOGGING "     Ueberpruefen Sie, ob auf dem verbundenen Laufwerk %BackupDrive% der ange-"  
	CALL:LOGGING "     gebene Pfad existiert, passen Sie ggf. den Pfad im Konfigurationsbereich"  
	CALL:LOGGING "     an und starten Sie die Batch erneut^^^!"  
	CALL:LOGGING ""  
GOTO:END

:ERROR_WHILE_DELETING_FOLDER
	SET "AtLeastOneError=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [^^^!] FEHLER: Fehler beim Vernichten von einem Verzeichnis."  
	CALL:LOGGING ""  
	CALL:LOGGING "     Beim Vernichten des Verzeichnisses '!CurrentFolder!!Folder2Delete!'   
	CALL:LOGGING "     ist ein Fehler aufgetreten. Bitte ueberpruefen Sie den Status des Ordners"  
	CALL:LOGGING "     schließen alle Programme, die auf den Ordner oder seine Inhalte zugreifen"  
	CALL:LOGGING "     und starten Sie die Batch erneut^^^!"  
	CALL:LOGGING ""  
GOTO:END


:WARNING_CONTINUE_OR_NOT
	SET "AtLeastOneWarning=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [?] WARNUNG:"  
	CALL:LOGGING ""  
	CALL:LOGGING "     Es wurde am heutigen !WoTa! das Laufwerk vom vorherigen Arbeitstag erwar-"  
	CALL:LOGGING "     tet. Entweder ist ein falsches Sicherungslaufwerk verbunden worden, oder"  
	CALL:LOGGING "     es ist nicht gewechselt worden."  
	CALL:LOGGING "     Dies kann durch ggf. Feiertage, oder auch Saeumnis geschehen."  
	CALL:LOGGING ""  
	CHOICE /C:jn /T:30 /D:n /M "     Wollen Sie mit der Bereinigung fortfahren"  
	if errorlevel 2 goto WARNING_CANCLED_BY_USER
	REM if errorlevel 1 
	CALL:LOGGING "     - Benutzer entscheidet sich fuer Fortsetzung der Bereinigung^^^!  
	CALL:LOGGING ""  
GOTO:EOF

:WARNING_NOT_CONFORM_WITH_NAMING_CONVENTION
	SET "AtLeastOneWarning=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [?] WARNUNG: Verzeichnis wird uebersprungen.""  
	CALL:LOGGING ""  
	CALL:LOGGING "     Das Verzeichnis !Folder2Delete! entspricht nicht dem Anlageschema."  
	CALL:LOGGING "     Ueberpruefen Sie das Verzeichnis und korrigieren Sie es ggf."  
	CALL:LOGGING ""  
GOTO:EOF

:WARNING_CANCLED_BY_USER
	SET "AtLeastOneWarning=1"  
	CALL:LOGGING ""  
	CALL:LOGGING " [?] WARNUNG: Abbruch durch Benutzer oder automatisch durch TimeOut:"  
	CALL:LOGGING ""  
	CALL:LOGGING "     Beheben Sie ggf. vorliegende Missstaende und starten Sie die Batch erneut^^^!"  
	CALL:LOGGING ""  
GOTO:END

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
:AT_LEAST_ONE_ERROR
	CALL:LOGGING ""  
	CALL:LOGGING " [?] Beim Bereinigen des Backup-Laufwerks sind Fehler aufgetreten."  
	CALL:LOGGING ""  
	CALL:LOGGING "     Ueberpruefen Sie die Fehlermeldungen und starten Sie die Batch erneut^^^!"  
	CALL:LOGGING ""  
GOTO:END

:SUCCESS
	CALL:LOGGING ""  
	CALL:LOGGING " [V] Bereinigen des Backup-Laufwerks erfolgreich^^^!"  
	CALL:LOGGING ""  
	CALL:LOGGING " Till next time..."  
GOTO:END

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

:END
	IF not "!LogFileName!" EQU "" (  
		REM echo "ERRORS  : !AtLeastOneError!"  
		REM echo "WARNUNGS: !AtLeastOneWarning!"  
		IF "!AtLeastOneError!" EQU "0" (  
			IF "!AtLeastOneWarning!" EQU "0" (  
				SET NewLogFileName=!LogFileName:STATUS=%SUCCESS%!
			) else (
				SET NewLogFileName=!LogFileName:STATUS=%WARNING%!
			)
		) else ( 
			SET NewLogFileName=!LogFileName:STATUS=%FAILURE%!
		)
		SET NewLogFileName=!NewLogFileName:DRIVENAME=%VolumeName%"!  
		RENAME "!LoggingPath!\!LogFileName!" "!NewLogFileName!"  
	) 
	If %WaitWhenFinished% equ 1 pause
	If %WaitWhenFinished% equ 0 (
		If %WaitSecondsWhenFinished% gtr 0 @(
			REM Hier bleibt nun wirklich echo stehen, da dies nur für den Consolenbetrachter relevant ist
			echo.
			echo Das Programm wird beendet in !WaitSecondsWhenFinished! Sekunden!
			set CountDown=!WaitSecondsWhenFinished!
			for /L %%i in (1,1,!WaitSecondsWhenFinished!) do (
				ping 1.1.1.1 -n 1 -w 1000 >NUL
				set /a CountDown=!CountDown!-1  
			)
		)
	)
EXIT
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

:EOF

Vielleicht hat ja jemand ebenfalls einen Verwendungszweck für dieses Skript.

Gruß Thror78