lightstar
Goto Top

Löschbefehl funktioniert nur wenn manuell ausgeführt wird und nicht in .bat

Guten Tag,

ich habe ein kleines Problem mit einem Script.

Ich arbeite an einem Script, welches mir am 01. jedes Monats einen Ordner mit dem Namen "%Tagesdatum%_Serverbackup_Monatssicherung" erstellt. Die restlichen Tage des Monats soll ein Ordner mit "%Tagesdatum%_Serverbackup_Tagessicherung" erstellt werden. Am Anfang jedes Monats sollen alle Ordner bis auf die Monatssicherung "%Tagesdatum%_Serverbackup_Monatssicherung" gelöscht werden.

In dem Script verwende ich einen Befehl welcher mir alle Ordner mit dem Namen "*_Serverbackup_Tagessicherung" löschen soll. Dieser Befehl funktioniert aus irgendeinem Grund nur wenn ich ihn manuell in einer Komandozeile ausführe.

Die Zeile um die es geht lautet:
IF %vormonat% == 12 (SET /a vorjahr=%yyyy%-1 && IF EXIST %sicherungspfad%\%vorjahr%\%vormonat% (FOR /f "tokens=*" %i IN ('dir /ad /b %sicherungspfad%\%vorjahr%\%vormonat%\*%sicherungsname_%') DO RMDIR %sicherungspfad%\%vorjahr%\%vormonat%\%i /s /q)) ELSE (IF EXIST %sicherungspfad%\%yyyy%\%vormonat% (FOR /f "tokens=*" %i IN ('dir /ad /b %sicherungspfad%\%yyyy%\%vormonat%\*%sicherungsname_%') DO RMDIR %sicherungspfad%\%yyyy%\%vormonat%\%i /s /q))  

Hat jemand eine Idee warum das Problem besteht?


Ich hoffe ich habe die Frage/das Problem verständlich niedergeschrieben face-smile

Der gesamte Quellcode sieht folgendermaßen aus:

:: ---------------------------------------------------------------
:: Variablen deklarieren
:: ---------------------------------------------------------------
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
SET yyyymmdd=%yyyy%_%mm%_%dd%_

SET sicherungspfad=D:\test_Sicherung
SET sicherungsname=Serverbackup_Tagessicherung
IF %dd% == 01 (SET sicherungsname=Serverbackup_Monatssicherung) ELSE (SET sicherungsname=Serverbackup_Tagessicherung && SET sicherungsname_=Serverbackup_Tagessicherung)

SET log_pfad=D:\Admin\Script\Logs\%yyyy%
SET log_dateiname="test.log"  
SET log=%log_pfad%\%log_dateiname%



:: ---------------------------------------------------------------
:: Erstelle Sicherungspfad
:: ---------------------------------------------------------------

IF NOT EXIST %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname% MD %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname%


:: ---------------------------------------------------------------
:: ---------------------------------------------------------------
:: Löschen der Vormonats Tagessicherungen
:: ---------------------------------------------------------------
:: ---------------------------------------------------------------

:: 1.Ermittlung des Vormonats
SET /a vormonat=1%mm%-1

SET vormonat=%vormonat:~-2%

IF %vormonat% == 00 (SET vormonat=12)

:: 2.Wenn Vormonat 12, muss das Jahr minus 1 gerechnet werden um Ordner Monat 12 aus Vorjahr zu löschen.
:: Wenn nicht lösche Vormonat aus aktuellem Jahr.
IF %vormonat% == 12 (SET /a vorjahr=%yyyy%-1 && IF EXIST %sicherungspfad%\%vorjahr%\%vormonat% (FOR /f "tokens=*" %i IN ('dir /ad /b %sicherungspfad%\%vorjahr%\%vormonat%\*%sicherungsname_%') DO RMDIR %sicherungspfad%\%vorjahr%\%vormonat%\%i /s /q)) ELSE (IF EXIST %sicherungspfad%\%yyyy%\%vormonat% (FOR /f "tokens=*" %i IN ('dir /ad /b %sicherungspfad%\%yyyy%\%vormonat%\*%sicherungsname_%') DO RMDIR %sicherungspfad%\%yyyy%\%vormonat%\%i /s /q))  

Content-ID: 203090

Url: https://administrator.de/forum/loeschbefehl-funktioniert-nur-wenn-manuell-ausgefuehrt-wird-und-nicht-in-bat-203090.html

Ausgedruckt am: 22.04.2025 um 14:04 Uhr

bastla
bastla 11.03.2013 aktualisiert um 16:44:28 Uhr
Goto Top
Hallo Lightstar und willkommen im Forum!

Wenn Du innerhalb einer Zeile den Wert einer Variablen (zB %vorjahr%) veränderst, kannst Du diesen veränderten Wert nur dann in der gleichen Zeile verwenden, wenn Du "delayedexpansion" benutzt - allerdings könntest Du Dir das Leben leichter machen, wenn Du einfach %vorjahr% auf jeden Fall verwendest, also (ungetestet) etwa:
SET /a vormonat=1%mm%-1
SET vormonat=%vormonat:~-2%
IF %vormonat%==00 SET /a vormonat=12
SET /a vorjahr=%yyyy%
IF %vormonat%==12 SET /a vorjahr-=1
IF EXIST %sicherungspfad%\%vorjahr%\%vormonat% FOR /f "tokens=*" %%i IN ('dir /ad/b %sicherungspfad%\%vorjahr%\%vormonat%\*%sicherungsname_%') DO RD /s /q %sicherungspfad%\%vorjahr%\%vormonat%\%%i  
Grüße
bastla
Lightstar
Lightstar 14.03.2013, aktualisiert am 15.03.2013 um 14:55:05 Uhr
Goto Top
Hallo bastla,

vielen Dank für die Hilfe!

Ich habe mein Script entsprechend angepasst.
Leider lässt sich das Script nach wie vor nur manuell (nach kopieren der einzelnen Befehle in die CMD) ausführen.

Ich habe die Batch mal über die CMD aufgerufen und in eine .txt umgeleitet.

Mein Script sieht mittlerweile folgendermaßen aus:

:: ---------------------------------------------------------------
:: Variablen deklarieren
:: ---------------------------------------------------------------
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
SET yyyymmdd=%yyyy%_%mm%_%dd%_

SET sicherungspfad=D:\test_Sicherung
IF %dd% == 01 (SET sicherungsname=Serverbackup_Monatssicherung) ELSE (SET sicherungsname=Serverbackup_Tagessicherung)

SET sicherungsname_=HW_Serverbackup_Tagessicherung

SET log_pfad=D:\Admin\Script\Logs\%yyyy%
SET log_dateiname="test.log"  
SET log=%log_pfad%\%log_dateiname%



:: ---------------------------------------------------------------
:: Erstelle Sicherungspfad
:: ---------------------------------------------------------------

IF NOT EXIST %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname% MD %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname%


:: ---------------------------------------------------------------
:: ---------------------------------------------------------------
:: Löschen der Vormonats Tagessicherungen
:: ---------------------------------------------------------------
:: ---------------------------------------------------------------

:: 1.Ermittlung des Vormonats
SET /a vormonat=1%mm%-1

SET vormonat=%vormonat:~-2%

IF %vormonat% == 00 SET vormonat=12

SET /a jahr_=%yyyy%

IF %vormonat% == 12 SET /a jahr_=%yyyy%-1


IF EXIST %sicherungspfad%\%jahr_%\%vormonat% FOR /f "tokens=*" %i IN ('dir /ad /b %sicherungspfad%\%jahr_%\%vormonat%\*%sicherungsname_%') DO RMDIR %sicherungspfad%\%jahr_%\%vormonat%\%i)  


Durch das umleiten in die .txt konnte ich feststellen, dass innerhalb der FOR-Schleife garkein Zugriff auf die Variablen möglich ist. Hier der Auszug:
D:\test_Sicherung>IF EXIST D:\test_Sicherung\2012\12 FOR /f "tokens=*" sicherungspfadjahr_vormonatsicherungsname_sicherungspfadjahr_vormonati)  

Hast du, oder jemand anderes eine Idee wie dieses Problem lösen kann?
Mich wundert es, dass genau die gleich Befehlszeile manuell erfolgreich abgesetzt werden kann...

Vielen Dank im voraus!
bastla
bastla 14.03.2013 um 13:38:49 Uhr
Goto Top
Hallo Lightstar!

Du verwendest als Schleifenvariable %%i (also mit 2 Prozentzeichen)?

Grüße
bastla

P.S.: Formatiere bitte Codeschnipsel und Textausgaben mit <code> / </code> (lässt sich auch nachträglich hinzufügen) ...
Lightstar
Lightstar 21.03.2013 aktualisiert um 23:00:04 Uhr
Goto Top
Hallo Bastla,

die Schleifenvariable habe ich bislang nicht genutzt.

Dies konnte das Problem aber tatsächlich lösen! Habe das Script jetzt ein paar Tage laufen und es läuft.

Leider verstehe ich nur noch nicht den genauen unterschied zwischen %i und %%i!?

1000 Dank schonmal für die super Hilfe!!!

Gruß
Lightstar
bastla
bastla 21.03.2013 um 23:34:31 Uhr
Goto Top
Hallo Lightstar!
Leider verstehe ich nur noch nicht den genauen unterschied zwischen %i und %%i!?
Der genaue Unterschied ist: % face-wink

Ok, etwas ernsthafter: Im Gegensatz zur Direkteingabe in der CMD-Shell, wo nur ein Prozentzeichen zu verwenden ist, muss dieses in einem Batch für Schleifenvariablen verdoppelt werden ("gewöhnliche" Variablen werden auch im Batch %Variable% geschrieben, außer bei delayedExpansion - dann: !Variable!) ...

Grüße
bastla