kim
Goto Top

Batch mehrere Ordner bei Löschvorgang ausschließen

Ich habe in einem Ordner z.B. unter C:\temp 20 Ordner, die ich aufräumen will.

In meiner ini Datei stehen die Ordner, die ich nicht gelöscht haben will, der Rest soll gelöscht werden.

ini-Datei

ordner1=xyz1
ordner2=xyz2
ordner3=xyz3
ordner4=xyz4

Wie ich diese Ordner aus der ini Auslese ist mir klar:

for /f "delims== tokens=1,2" %%i in ('findstr "ordner1" config.ini') do @set ordner1=%%j
.
.
.

Da aber das DOS Tool del keinen Ausschluss vorsieht, suche ich nach einer Möglichkeit wie ich mein Problem lösen kann.

Verschieben ist keine Lösung, da viel zu Zeitaufwendig (mehrere Hunderttausende Dateien).

Eine andere Möglichkeit habe ich noch nicht gefunden.

Bin für jede Hilfe dankbar.

Grüße
Kim

Content-Key: 100449

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

Printed on: April 19, 2024 at 00:04 o'clock

Member: bastla
bastla Oct 28, 2008 at 15:19:33 (UTC)
Goto Top
Hallo Kim!

Bei nur 20 Ordnern wäre es vermutlich sicherer (und auch nicht viel aufwändiger), die zu löschenden Ordner festzulegen ...

Trotzdem: Wenn Deine "config.ini" nur die Ordnernamen enthielte (was einen Vergleich der gesamten Zeile möglich machte), würde ich das etwa so versuchen (das "echo" vor dem "del" soll ein gefahrloses Testen erlauben):
for /d %%i in ("C:\Temp\*.*") do @findstr /i /x /c:"%%i" "config.ini">nul || echo del "%%i" /s /q
Zu beachten wäre, dass nur exakte Übereinstimmung des in der "config.ini" angegebenen Pfades zum Ausschluss führt, also ein Eintrag "Dieser Ordner" einen existierenden Ordner "Dieser Ordner auch" nicht ausschließen würde (was sich allerdings durch den Ersatz des Schalters "/x" durch "/b" erreichen ließe). Achtung auch auf zB zusätzliche Leerzeichen am Zeilenende (da dadurch ebenfalls keine Übereinstimmung mehr gegeben wäre)!

Grüße
bastla

[Edit] Bei Angabe des Ordners ("C:\Temp") im "for /d" muss die Ordnerliste in "config.ini" den vollständigen Pfad (also zB "C:\Temp\xyz1") enthalten, oder die "findstr"-Schreibweise auf
findstr /i /x /c:"%%~nxi" "config.ini"
geändert werden. [/Edit]
Member: Kim
Kim Oct 29, 2008 at 07:09:54 (UTC)
Goto Top
Komisch, kriege andauernd diesen Fehler, wenn ich aber findstr in der console eingebe funktionierts, in anderen Batches läuft der Befehl auch. :S

'findstr' is not recognized as an internal or external command, operable program or batch file.#

Hier noch die Batch und die ini-Datei

test.cmd

oder

test2.cmd

config.ini:
C:\temp\test\1
C:\temp\test\3
C:\temp\test\5
C:\temp\test\7
C:\temp\test\9

hab schon ein bisschen Rumgespielt, aber will net laufen face-sad

Gruß
Kim
Member: bastla
bastla Oct 29, 2008 at 10:07:17 (UTC)
Goto Top
Hallo Kim!

Zu Deinem "findstr"-Problem fällt mir auf die Schnelle nix ein, außer das Ganze direkt aus der Console zu starten:
for /d %i in ("C:\temp\test\*.*") do @findstr /i /x /c:"%i" "config.ini">nul || @echo del "%i" /s /q
wobei noch anzumerken wäre, dass die "config.ini" entweder im aktuellen Verzeichnis liegen muss oder, besser, mit vollständigem Pfad (etwa: "C:\Scripts\config.ini") anzugeben wäre.

Grüße
bastla
Member: Kim
Kim Oct 30, 2008 at 10:45:44 (UTC)
Goto Top
Hallo bastla,

vielen Dank für die ganze Arbeit!

Problem ist gelöst und läuft sauber, musste Datei löschen und erneut schreiben (Windows is da irgendwie panne, naja anderes Thema ;))

Hier der funktionierende Code:

delete_dir.cmd
for /d %%i in ("C:\temp\test\*") do @findstr /i /x /c:"%%i" "C:\temp\config.ini">nul || @rmdir "%%i" /S /Q  

config.ini
C:\temp\test\1
C:\temp\test\3
C:\temp\test\5

Gruß Kim
Member: ruedi1234
ruedi1234 Aug 16, 2018 updated at 05:32:25 (UTC)
Goto Top
Hallo allerseits,
der Beitrag ist schon etwas älter aber als Hinweis für alle die das auch gebrauchen können und Windows 8.1 einsetzen:
aus einem mir unerfindlichen Grund funktioniert
for /d %%i in ("C:\temp\test\*") do @findstr /i /x /c:"%%i" "C:\temp\config.ini">nul || @rmdir "%%i" /S /Q  

dies unter Windows 8.1 nicht mehr. Nach langem probieren bin ich darauf gestoßen, das der Übeltäter die findstr Funktion ist.
Wenn man den Parameter "/x" wegläßt klappt es, sonst nicht. Laut "findstr /?" Aufruf bedeutet " /X Gibt Zeilen aus, die vollkommen übereinstimmen." Bei meinem Test stimmte der Text vollkommen überein, nur daß nichts gefunden wurde, sprich keine Ausgabe erfolgte.
An den " Anführungszeichen kann es auch nicht liegen, denn ich habe es versuchshalber mit Suchbegriffen mit ganzen Wörtern probiert.

So geht es:
for /d %%i in ("C:\temp\test\*") do @findstr /i /c:"%%i" "C:\temp\config.ini">nul || @rmdir "%%i" /S /Q  

Nachtrag:
Ich hatte gedacht die Lösung gefunden zu haben - irgendwie hat findstr eine Macke unter Windows 8.1:
ein einfacher Test funktioniert mit test.txt Inhalt:
test2
test3
test4
d:\__Bkp_Batch>findstr /i /c:test2 test.txt

jedoch wenn ich mit kompletten Pfaden arbeiten will geht auch dies nicht mehr face-sad

Hat vielleicht jemand eine Lösung ohne findstr die utner W8.1 läuft ?

Gruß Rüdi