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-Key: 203090

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

Printed on: April 26, 2024 at 10:04 o'clock

Member: bastla
bastla Mar 11, 2013 updated at 15:44:28 (UTC)
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
Member: Lightstar
Lightstar Mar 14, 2013, updated at Mar 15, 2013 at 13:55:05 (UTC)
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!
Member: bastla
bastla Mar 14, 2013 at 12:38:49 (UTC)
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) ...
Member: Lightstar
Lightstar Mar 21, 2013 updated at 22:00:04 (UTC)
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
Member: bastla
bastla Mar 21, 2013 at 22:34:31 (UTC)
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