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

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

Frage Entwicklung Batch & Shell

Mitglied: Lightstar

Lightstar (Level 1) - Jetzt verbinden

11.03.2013, aktualisiert 15.03.2013, 1398 Aufrufe, 5 Kommentare, 1 Danke

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:
01.
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

Der gesamte Quellcode sieht folgendermaßen aus:

01.
:: --------------------------------------------------------------- 
02.
:: Variablen deklarieren 
03.
:: --------------------------------------------------------------- 
04.
SET dd=%DATE:~0,2% 
05.
SET mm=%DATE:~3,2% 
06.
SET yyyy=%DATE:~6,4% 
07.
SET yyyymmdd=%yyyy%_%mm%_%dd%_ 
08.
 
09.
SET sicherungspfad=D:\test_Sicherung 
10.
SET sicherungsname=Serverbackup_Tagessicherung 
11.
IF %dd% == 01 (SET sicherungsname=Serverbackup_Monatssicherung) ELSE (SET sicherungsname=Serverbackup_Tagessicherung && SET sicherungsname_=Serverbackup_Tagessicherung) 
12.
 
13.
SET log_pfad=D:\Admin\Script\Logs\%yyyy% 
14.
SET log_dateiname="test.log" 
15.
SET log=%log_pfad%\%log_dateiname% 
16.
 
17.
 
18.
 
19.
:: --------------------------------------------------------------- 
20.
:: Erstelle Sicherungspfad 
21.
:: --------------------------------------------------------------- 
22.
 
23.
IF NOT EXIST %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname% MD %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname% 
24.
 
25.
 
26.
:: --------------------------------------------------------------- 
27.
:: --------------------------------------------------------------- 
28.
:: Löschen der Vormonats Tagessicherungen 
29.
:: --------------------------------------------------------------- 
30.
:: --------------------------------------------------------------- 
31.
 
32.
:: 1.Ermittlung des Vormonats 
33.
SET /a vormonat=1%mm%-1 
34.
 
35.
SET vormonat=%vormonat:~-2% 
36.
 
37.
IF %vormonat% == 00 (SET vormonat=12) 
38.
 
39.
:: 2.Wenn Vormonat 12, muss das Jahr minus 1 gerechnet werden um Ordner Monat 12 aus Vorjahr zu löschen. 
40.
:: Wenn nicht lösche Vormonat aus aktuellem Jahr. 
41.
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))
Mitglied: bastla
11.03.2013, aktualisiert um 16:44 Uhr
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:
01.
SET /a vormonat=1%mm%-1 
02.
SET vormonat=%vormonat:~-2% 
03.
IF %vormonat%==00 SET /a vormonat=12 
04.
SET /a vorjahr=%yyyy% 
05.
IF %vormonat%==12 SET /a vorjahr-=1 
06.
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
Bitte warten ..
Mitglied: Lightstar
14.03.2013, aktualisiert 15.03.2013
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:

01.
:: --------------------------------------------------------------- 
02.
:: Variablen deklarieren 
03.
:: --------------------------------------------------------------- 
04.
SET dd=%DATE:~0,2% 
05.
SET mm=%DATE:~3,2% 
06.
SET yyyy=%DATE:~6,4% 
07.
SET yyyymmdd=%yyyy%_%mm%_%dd%_ 
08.
 
09.
SET sicherungspfad=D:\test_Sicherung 
10.
IF %dd% == 01 (SET sicherungsname=Serverbackup_Monatssicherung) ELSE (SET sicherungsname=Serverbackup_Tagessicherung) 
11.
 
12.
SET sicherungsname_=HW_Serverbackup_Tagessicherung 
13.
 
14.
SET log_pfad=D:\Admin\Script\Logs\%yyyy% 
15.
SET log_dateiname="test.log" 
16.
SET log=%log_pfad%\%log_dateiname% 
17.
 
18.
 
19.
 
20.
:: --------------------------------------------------------------- 
21.
:: Erstelle Sicherungspfad 
22.
:: --------------------------------------------------------------- 
23.
 
24.
IF NOT EXIST %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname% MD %sicherungspfad%\%yyyy%\%mm%\%yyyymmdd%%sicherungsname% 
25.
 
26.
 
27.
:: --------------------------------------------------------------- 
28.
:: --------------------------------------------------------------- 
29.
:: Löschen der Vormonats Tagessicherungen 
30.
:: --------------------------------------------------------------- 
31.
:: --------------------------------------------------------------- 
32.
 
33.
:: 1.Ermittlung des Vormonats 
34.
SET /a vormonat=1%mm%-1 
35.
 
36.
SET vormonat=%vormonat:~-2% 
37.
 
38.
IF %vormonat% == 00 SET vormonat=12 
39.
 
40.
SET /a jahr_=%yyyy% 
41.
 
42.
IF %vormonat% == 12 SET /a jahr_=%yyyy%-1 
43.
 
44.
 
45.
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:
01.
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!
Bitte warten ..
Mitglied: bastla
14.03.2013 um 13:38 Uhr
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) ...
Bitte warten ..
Mitglied: Lightstar
21.03.2013, aktualisiert um 23:00 Uhr
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
Bitte warten ..
Mitglied: bastla
21.03.2013 um 23:34 Uhr
Hallo Lightstar!
Leider verstehe ich nur noch nicht den genauen unterschied zwischen %i und %%i!?
Der genaue Unterschied ist: %

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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Server
gelöst Login .bat funktioniert nicht immer (5)

Frage von xtra-long zum Thema Windows Server ...

Linux
LTSP: PXE Boot funktioniert nicht (15)

Frage von Fenris14 zum Thema Linux ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...