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
GELÖST

Verschachtelte Schleife in Batch (Config.txt auslesen)

Frage Entwicklung Batch & Shell

Mitglied: Blubberhorst

Blubberhorst (Level 1) - Jetzt verbinden

15.06.2012, aktualisiert 16.06.2012, 3743 Aufrufe, 3 Kommentare

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.

01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
 
04.
for /F "tokens=1,2 delims=	" %%a in ('type config.txt') do ( 
05.
	 
06.
	set count=0 
07.
	for /F %%g in ('dir /b %%a') do ( 
08.
		set /a count+=1 
09.
10.
	echo !count! 
11.
12.
 
13.
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
01.
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,
Mit freundlichen Grüßen B.
Mitglied: bastla
15.06.2012, aktualisiert 16.06.2012
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:
01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
 
04.
for /F "delims=	" %%a in ('type config.txt') do ( 
05.
    for /F %%g in ('dir /b/ad/od "%%~a"') do set "Letzte=%%g" 
06.
    rd "%%~a\!Letzte!" 
07.
)
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
Bitte warten ..
Mitglied: Blubberhorst
16.06.2012, aktualisiert um 11:58 Uhr
Hi bastla!

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.

01.
@echo on 
02.
 
03.
setlocal enabledelayedexpansion  
04.
 
05.
for /F "delims=	" %%a in ('type config.txt') do (  
06.
	for /F "tokens=1-3" %%g in ('dir /b/ad/od "%%~a\*%date%"') do set "Letzte=%%g %%h %%i" 
07.
	rd /q "%%~a\!Letzte!"  
08.
09.
 
10.
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! =)
Bitte warten ..
Mitglied: bastla
16.06.2012 um 13:22 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

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

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

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...