blubberhorst
Goto Top

Verschachtelte Schleife in Batch (Config.txt auslesen)

Hallo miteinander,

eigentlich konnte ich mich immer ganz gut davor bewahren in einem Forum nach Hilfe zu fragen, aber mittlerweile bin ich an einem Punkt angekommen, an dem ich schier am Verzweifeln bin.

Es geht um folgendes: Ich möchte aus einer Config.txt einen Ordner(namen) auslesen und in diesem dann den (Unter-)Ordner löschen, der am aktuellsten ist.

@echo off
setlocal enabledelayedexpansion

for /F "tokens=1,2 delims=	" %%a in ('type config.txt') do (  
	
	set count=0
	for /F %%g in ('dir /b %%a') do (  
		set /a count+=1
	)
	echo !count!
)

pause

Die äußere FOR-Schleife zieht die erste Spalte aus der Config, wie man an der Struktur sehen kann. In dieser stehen die Ordnernamen. Als nächstes will ich die Anzahl der vorhandenen Ordner in jedem dieser Ordner zählen. Dazu die innere Schleife. So, die Ausgabe über echo zeigt mir nun die richte, gewünschte Zahl an.
Doch wenn ich statt des echos ein
rd "!count!. Ordner %date%" ::Namensschema der inneren Ordner  
angebe, dann ist count leer bzw. es wird halt keine Datei mit Namen !count!... gefunden.

Wie kann ich den Ordnernamen, nach dem gelöscht werden soll so zusammenbauen, dass count tatsächlich die gefundene Zahl zeigt?

Oder alternativ, wie kann ich die Anzahl der Ordner ohne Schleife ermitteln? Sonstige Anregungen, Vorschläge? Oder eine andere Idee wäre ja, das Datum nicht aus dem Namen zu ermitteln, sondern aus den Attributen, falls das geht? Dann erspar ich mir das durchzählen vllt?

Vielen Dank schonmal,
MfG B.

Content-Key: 186552

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: bastla
bastla 15.06.2012, aktualisiert am 16.06.2012 um 01:47:12 Uhr
Goto Top
Hallo Blubberhorst und willkommen im Forum!

Falls es immer nur darum gehen sollte, den jüngsten Ordner zu löschen, dann ohne Zählerei etwa so:
@echo off
setlocal enabledelayedexpansion

for /F "delims=	" %%a in ('type config.txt') do (  
    for /F %%g in ('dir /b/ad/od "%%~a"') do set "Letzte=%%g"  
    rd "%%~a\!Letzte!"  
)
Dein Ansatz kann (wegen %date%) nur für Ordner mit dem heutigen Datum im Namen funktionieren - und das auch nur, wenn Du vorweg den Ordner "%%a" mit angibst, also
rd "%%~a\!count!. Ordner %date%"
Falls übrigens tatsächlich nur Ordner mit dem Tagesdatum infrage kommen, wäre in meinem Ansatz oben
    for /F %%g in ('dir /b/ad/od "%%~a\*%date%"') do set "Letzte=%%g"
zu verwenden ...

Was steht denn übrigens genau in der "config.txt"? Aufgrund der "for"-Schleife sähe das nach
Ordnername<TAB>noch was
aus (wobei nicht klar ist, ob der Ordnername ev unter Anführungszeichen steht, weswegen ich vorsichtshalber "%%~a" verwendet habe) ...
Noch zu
wie kann ich die Anzahl der Ordner ohne Schleife ermitteln?
Ganz ohne geht's zwar nicht, aber Du könntest es so machen:
for /f %%g in ('dir /ad "%%~a"') do set "Anzahl=%%g"
Grüße
bastla
Mitglied: Blubberhorst
Blubberhorst 16.06.2012 aktualisiert um 11:58:30 Uhr
Goto Top
Hi bastla! face-smile

Danke für deine Antwort. Also das Datum steht immer auch im Ordnernamen, und daran soll es auch ausgemacht werden. Denn das ganze dient dazu, ein zuvor angestoßenes Ordner-Erstellen wieder rückgängig zu machen, also die erstellen Strukturen wieder zu löschen. Nicht, dass durch zweimaliges Ausführen noch ein Ordner von letzter Woche gelöscht wird, weil es auf einmal der jüngste ist! Sondern nur der mit dem heutigen Datum. Das habe ich falsch ausgedrückt.

Ui, stimmt, den Pfad zum Unterordner habe ich ganz vergessen! Wenn das jetzt daran gescheitert wäre... :D

Ja die Ordner sind ohne " und mit Tabs.

@echo on

setlocal enabledelayedexpansion 

for /F "delims=	" %%a in ('type config.txt') do (   
	for /F "tokens=1-3" %%g in ('dir /b/ad/od "%%~a\*%date%"') do set "Letzte=%%g %%h %%i"  
	rd /q "%%~a\!Letzte!"   
)

pause

Auf jeden Fall war dein Code die Lösung! Musste nur noch %%g um %%h und %%i erweitern, damit er den gesamten Namen mitnimmt und nicht nur "5.", was ja wichtig beim nächsten Schritt ist, dem Löschen.

Also, was hab ich gelernt: Nicht umständlich irgendwas künstlich zusammenbauen, sondern das was eh schon vorhanden ist, einfach aus der For-Schleife mit rausziehen durch entsprechende Operatoren wie * z.B. :D Ich wusste das kann nicht so schwer sein *seufz*

Danke nochmal! =)
Mitglied: bastla
bastla 16.06.2012 um 13:22:13 Uhr
Goto Top
Hallo Blubberhorst!
Musste nur noch %%g um %%h und %%i erweitern
Die noch bessere Lösung (hätte ich gleich berücksichtigen sollen) wäre
for /F "delims=" %%g in ('dir /b/ad/od "%%~a\*%date%"') do set "Letzte=%%g"
- damit wird, unabhängig davon, wie viele Leerzeichen enthalten sind, der Ordnername immer "am Stück" geliefert ...

Grüße
bastla