franzmann
Goto Top

Löschvorgang automatisieren

Hallo alle zusammen,
hoffe jemand weiß wie ich folgendes Problem realisieren kann.
Ich hab unter Windows einen Ordner Versionen der bsp. die
Unterordner 1.1, 1.2, 1.3, 1.4, 1.5 beinhaltet.

436b96362e69b05493730f4f8c8ff96a-bild

Wie kann ich realisieren das mir per Skript alle Unterordner außer dem Aktuellsten, in diesem Fall 1.5, gelöscht werden ? Die 5 Unterordner sind vom Ursprung alle gleich alt, so dass man nicht nach dem Erstellungsdatum gehen kann.
Hoffe die Problematik wurde klar...
Greetz

Content-Key: 42037

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

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

Member: Biber
Biber Oct 12, 2006 at 12:53:28 (UTC)
Goto Top
Moin Franzmann,

angenommen, der Parent-Ordner der "Versions-Verzeichnisse" 1.1; 1.2; .... 1.28g; .... 3.9a, 4.00;.. heißt D:\Versionen
und die Namenskonvention für die Versionsverzeichnisse sei "?.*" [eine Stelle vor dem Punkt, beliebige Stellen danach], dann:

Am Prompt:
>for /f "skip=1" %i in ('dir /b /Ad /o-n D:\Versionen\?.*') do @ECHO rd /s /q %i  

Das "@ECHO" nach dem erfolgreichen Testen ersatzlos löschen.
Als Batch jeweils zwei %-Zeichen statt ein %-Zeichen.

Gruß
Biber
Member: Franzmann
Franzmann Oct 12, 2006 at 13:22:02 (UTC)
Goto Top
Hey Biber,
danke für deine Hilfe !
Also der Test mit @echo klappt wunderbar,
doch sobald ich das @echo wegnehme spuckt er folgendes aus:
C:\>for /f "skip=1" %i in ('dir /b /Ad /o-n D:\temp\?.*') do rd /s /q %i

C:\>rd /s /q 1.6
Das System kann die angegebene Datei nicht finden.

C:\>rd /s /q 1.5
Das System kann die angegebene Datei nicht finden.

C:\>rd /s /q 1.4
Das System kann die angegebene Datei nicht finden.

C:\>rd /s /q 1.3
Das System kann die angegebene Datei nicht finden.

C:\>rd /s /q 1.2
Das System kann die angegebene Datei nicht finden.

C:\>rd /s /q 1.1
Das System kann die angegebene Datei nicht finden.

Weißt du warum ?
mfg
Member: Biber
Biber Oct 12, 2006 at 13:41:46 (UTC)
Goto Top
Jepp, Franzmann,

sorry, die Pfadangabe "D:\Versionen" (bei mir) bzw. "D:\temp" (bei Dir) muss natürlich auch beim RD-Befehl angegeben werden.

for /f "skip=1" %i in ('dir /b /Ad /o-n D:\temp\?.*') do rd /s /q D:\Temp\%i

Gruß
Biber
Member: Franzmann
Franzmann Oct 12, 2006 at 15:51:04 (UTC)
Goto Top
Yoh aller erste Sahne... läuft wie sau !!!
Ich danke dir...
mfg
Member: bastla
bastla Oct 12, 2006 at 18:04:13 (UTC)
Goto Top
@Biber

Wie würdest Du bei zusätzlichen (vor dem Punkt) zweistelligen Versionsnummern vorgehen - mit If Exist ??.* alle Einstelligen weg und dann wie gehabt?

Grüße
bastla
Member: Franzmann
Franzmann Oct 13, 2006 at 07:11:16 (UTC)
Goto Top
Habe ein neues Bild geuploadet !
436b96362e69b05493730f4f8c8ff96a-bild
In diesen Ordnern die man auf dem Bild sieht, sind jeweils die einzelnen Versionsordner enthalten. Wenn ich die Batch da jeweils reinkopiere klappt das auch tadellos !
Nur will ich die halt nicht überall vorab reinkopieren, durchlaufen lassen und dann wieder löschen. Ich würde gerne einen Zusatz in die Batch schreiben und zwar eine allgemeine Pfadangabe mit der er sämtlich Ordner der reihe nach abarbeitet.
Problematisch wird es auch bei den unterschiedlichen Namen der Ordner, wie hier beispielhaft mit den Pfeilen markiert wurde. Wie muss sowas aussehen ?
mfg

Franzmann
Member: bastla
bastla Oct 13, 2006 at 08:01:57 (UTC)
Goto Top
Hallo Franzmann!

Wenn der oben dargestellte Ordner "D:\Temp" heißt, werden durch die folgende Variante in allen darin befindlichen Ordnern mit 4-stelligen Bezeichnungen die entsprechenden Unterordner gelöscht:

REM Nur zur Sicherheit in den richtigen Ordner wechseln ...
cd /d D:\Temp
for /f %a in ('dir /b /Ad ????') do for /f "skip=1" %i in ('dir /b /Ad /o-n %a\?.*') do @echo rd /s /q %a\%i  

Soll keine Namenskonvention (nur 4-stellig) für die erste Ordnerebene ("A000", ..., "d0002", ...) berücksichtigt werden, so kannst Du "????" durch "*.*" ersetzen und damit alle Ordner in D:\Temp behandeln.

HTH
bastla
Member: Franzmann
Franzmann Oct 13, 2006 at 08:49:59 (UTC)
Goto Top
Ja subba... auch das läuft prima !
Ich danke dir bzw. euch Beiden !!!
Die Batch hat mir meinen Zeitaufwand um mehr als 3/4 gekürzt dank euch...
Schönes Weekend !!!
Bis dahin...

Franzmann
Member: Biber
Biber Oct 13, 2006 at 11:01:57 (UTC)
Goto Top
Hm, bastla,

ist kniffelig, weil ich beim DIR-Befehl mit "?"-Jokerzeichen das "Feature" habe, dass ein "?" ja bedeutet:
"Ein beliebiges Zeichen oder keins".
Sprich: wenn ich folgende Verzeichnis-Struktur hätte [alles VOR dem Punkt soll numerisch sein]
d:\temp\test\1.1
d:\temp\test\1.2
d:\temp\test\1.3
d:\temp\test\1.4
d:\temp\test\1.5
d:\temp\test\9.4
d:\temp\test\10.1
d:\temp\test\10.2
d:\temp\test\10.2.3.4
d:\temp\test\10.5
d:\temp\test\10.7
d:\temp\test\10.7.1.3
[entspricht jetzt der Ausgabe von "dir /s /b d:\temp\test"]

--> dann würde ja die alphatische Sortierung des DIR-Befehls mit Wildcard "??" folgendes liefern:
[alle Beispiele am CMD-Prompt zur Demo]
>dir /s /b /o-n d:\temp\test\??.*
d:\temp\test\9.4
d:\temp\test\10.7.1.3
d:\temp\test\10.7
d:\temp\test\10.5
d:\temp\test\10.2.3.4
d:\temp\test\10.2
d:\temp\test\10.1
d:\temp\test\1.5
d:\temp\test\1.4
d:\temp\test\1.3
d:\temp\test\1.2
d:\temp\test\1.1
Wenn also die Anforderung wäre, nur die höchsten n zweistelligen Version(en) zu löschen und auch einstellige "Versions-Verzwichnisse" vorhanden sein können, dann wäre die Mimik.

Fall a) Zweistellige sind vorhanden; alle einstelligen können deshalb ohnehin gelöscht werden:
Zuerst alle einstelligen Versionen löschen. Danach "zweistellige" behandeln:
>for /f %i in ('dir /b /Ad /o-n d:\temp\test\?.*') do @rd /s /q d:\temp\test\%i  
>for /f "skip=1" %i in ('dir /b /Ad /o-n d:\temp\test\??.*') do @rd /s /q d:\temp\test\%i  


Fall b) Nur zweistellige Verzeichnisse sollen behandelt werden; einstellige bleiben wie sie sind.

[Zwischenschritt zur Verdeutlichung]
<b>>for /f "delims=. tokens=1,*" %i in ('dir /s /b /o-n d:\temp\test\??.*') do @if %~nxi GTR 9 @echo %i.%j</b>  
d:\temp\test\10.7.1.3
d:\temp\test\10.7
d:\temp\test\10.5
d:\temp\test\10.2.3.4
d:\temp\test\10.2
d:\temp\test\10.1
Diesen Output lasse ich mal in einer "inneren" FOR /F-Anweisung erzeugen.
Denn ich will ja davon, von diesem Output, die (gemäß logischer Sortierung) erste Zeile überspringen.

>for /f "skip=1" %x in ('<b>for /f "delims=. tokens=1,*" %i in ^('dir /s /b /o-n d:\temp\test\??.*'^) do @if %~nxi GTR 9 @echo %i.%j</b>') do @echo rd /s /q d:\temp\test\%x  
rd d:\temp\test\d:\temp\test\10.7
rd d:\temp\test\d:\temp\test\10.5
rd d:\temp\test\d:\temp\test\10.2.3.4
rd d:\temp\test\d:\temp\test\10.2
rd d:\temp\test\d:\temp\test\10.1

Gruß
Biber
Member: bastla
bastla Oct 13, 2006 at 11:50:37 (UTC)
Goto Top
Hallo Biber!

Was machst Du eigentlich mit dem d:\temp\test\x.* in

for /f %i in ('dir /b /Ad /o-n d:\temp\test\?.* d:\temp\test\x.*') do @rd /s /q d:\temp\test\%i  

(und, ganz nebenbei, kann ich einen Teil eines "Schnipsels" beim Posten - innerhalb eines code-Blocks - mit einer Formatierung irgendwie hervorheben)?

Grüße
bastla
Member: Biber
Biber Oct 13, 2006 at 12:42:35 (UTC)
Goto Top
face-wink @bastla

Das hatte ich vergessen zu löschen.. war vom Testen am CMD-Prompt übriggebileben:
for /f %i in ('dir /b /Ad /o-n d:\temp\test\?.* <b>d:\temp\test\??.*</b>') do @rd /s /q d:\temp\test\%i  

.. so hatte ich probiert, was das Ergebnis wäre, wenn ich erst die Ein-, dann die zweistelligen "Versions"-Verzeichnisse abarbeite. Käme aber nur Müll raus.

Dann hatte ich das "??.*" durch "x.*" ersetzt und vergessen.
Ich lösche es oben raus.

Die Formatierung fett zum Beispiel klappt auch innerhalb der Formatierung "Code".

Gruß
Biber
Member: bastla
bastla Oct 13, 2006 at 12:46:23 (UTC)
Goto Top
@Biber

Na, da bin ich ja beruhigt ... face-wink

... und danke für den Formatierungstipp - hatte ich wohl an unpassender Stelle probiert ...

Grüße
bastla