Top-Themen

Aktuelle Themen (A bis Z)

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 Bestimmte Unterverzeichnisse ermitteln, dann deren Inhalt und die Verzeichnisse selbst löschen

Mitglied: demonllama

demonllama (Level 1) - Jetzt verbinden

21.03.2007, aktualisiert 23.03.2007, 7524 Aufrufe, 9 Kommentare

Die Aufgabe die es für mich zu lösen gilt ist die folgende:

1. In einem Ordner sind beliebig viele Unterordner in maximal 3 Ebenen

Ursprungsordner
-Ordner 1 Ebene 1
--Unterordner 1 Ebene 2
---Unterordner 1 Ebene 3
-Ordner 2 Ebene 1
--Unterordner 2 Ebene 2
---Unterordner 2 Ebene 3
-Ordner n Ebene 1
--Unterordner n Ebene 2
---Unterordner n Ebene 3

2. Es gilt doppelte Inhalte gewisser Unterordner auszumachen und samt Ordner zu löschen
3. Der Stammordner der Inhalte der im selben Ursprungsordner liegen kann darf nicht gelöscht werden

Genauer gesagt geht es um Scriptbibliotheken die in Unterordnern unnötig sind, aber in einer Instanz gebraucht werden.

Ich bin ein absoluter Windows-Batchanfänger und komme mit der Syntax beim besten Willen nicht zurecht.
Aber ich habe schon einmal wie folgt angefangen:

dir /s /b libs > dat.txt
FOR %%i IN (dat.txt) DO dir /s /b ace* > del.txt

Ich habe dann in der Datei del.txt auf jeden Fall genau schon die Ordner die es samt Inhalt zu löschen gilt.
Die Zweistufigkeit der Ordnersuche mache ich deshalb, da die Bibliothek die erhalten werden soll mit der direkten Suche nach ace* auch gefunden und gelöscht würde. Da sie aber nicht in einem Unterordner mit libs liegt, schließe ich sie so aus.

Leider gelingt es mir nicht in einer weiteren FOR-Schleife die betroffenen Ordner in del.txt per del und anschließend rd zu löschen.
Die Suchfunktion dieser Seite führt sicher zu einigen Tipps ähnlicher Probleme, da ich die Syntax aber nicht sicher verstehe, bin ich nicht weitergekommen.
Mitglied: Biber
21.03.2007 um 19:23 Uhr
Moin demonllama,

willkommen im Forum.
Vorab: finde ich super, dass Du als Batch-Anfänger es dennoch erst selbst versucht hast und nicht einfach so eine pauschale "Ich mussn skript haben, wo drinne dann alles gelöscht wird oder so"-Frage gestellt hast.
Auch die Detailbeschreibung ist allerbest. Vorbildlich. Darfst gerne öfter was fragen hier.

Dennoch auch zu diesen Beschreibungen zwei kleine Rückfragen.
a) Du begründest dieses zweistufige Vorgehen damit, dass Dir sonst eine ace*-Datei im (relativen) Root-Ordner liegt, mitgelöscht werden würde.
Hat diese keinen "festen" Namen? Dann könnte man/frau sie mit "findstr /v dieserAceName" ausschliessen.
b) Reden wir jetzt von ace*-Unterverzeichnissen, die komplett gelöscht werden sollen?
Oder von ace*-Dateien, die als einzige Dateien-Wildcards in Irgendwie-benannten-Unterordnern liegen? Oder gibt es auch Unterordner, die Dateien ungleich "ace*" enthalten und die erhalten bleiben sollen?
Wenn ALLE Unterordner samt Inhalt gelöscht werden sollen, dann liesse sich Deine ohnehin schon recht handliche Anweisung weiter eindampfen:
for /d %i in (x:\libs\*) do @echo Rd /s /q %i
[Test vom CMD-Prompt aus; das Echo zum Scharfmachen weg]
Und die Variante, alle Unterverzeichnisse unterhalb "libs", die "ace*"-Dateien enthalten sollen komplett gelöscht werden:
for /d %i in (x:\libs\*) do @if exist "%i\ace*" echo Rd /s /q %i

Gruss
Biber
Bitte warten ..
Mitglied: demonllama
22.03.2007 um 10:18 Uhr
Hallo Biber,

vielen Dank für deine Hilfe.
Ich habe deinen letzten Codetipp soweit schon einmal versucht, komme damit aber nicht an das gewünschte Ergebnis, da ich scheinbar nicht die richtigen Ordner erreiche, oder vielmehr die Wildcards ins leere führen.
Ich hatte folgendes in meinem Versuchsbereich versucht:

01.
for /d %i in (c:\temp\*\libs\*) do @if exist "%i\ace*" Rd /s /q %i
Zu deinen Fragen poste ich mal meine "Versuchsumgebung":

C:\temp\ace
C:\temp\test 1
C:\temp\test 2
C:\temp\test 3
C:\temp\ace\ace1\
C:\temp\ace\ace2\
C:\temp\ace\ace1\datei 1.dat
C:\temp\ace\ace1\datei 2.dat
C:\temp\ace\ace1\datei 3.dat
C:\temp\ace\ace2\datei 1.dat
C:\temp\ace\ace2\datei 2.dat
C:\temp\ace\ace2\datei 3.dat
C:\temp\test 1\data
C:\temp\test 1\libs
C:\temp\test 1\libs\ace1
C:\temp\test 1\libs\ace2
C:\temp\test 1\libs\lib 1
C:\temp\test 1\libs\lib 2
C:\temp\test 1\libs\ace1\datei 1.dat
C:\temp\test 1\libs\ace1\datei 2.dat
C:\temp\test 1\libs\ace1\datei 3.dat
C:\temp\test 1\libs\ace2\datei 1.dat
C:\temp\test 1\libs\ace2\datei 2.dat
C:\temp\test 1\libs\ace2\datei 3.dat
C:\temp\test 1\libs\lib 1\datei 1.dat
C:\temp\test 1\libs\lib 1\datei 2.dat
C:\temp\test 1\libs\lib 1\datei 3.dat
C:\temp\test 1\libs\lib 2\datei 1.dat
C:\temp\test 1\libs\lib 2\datei 2.dat
C:\temp\test 1\libs\lib 2\datei 3.dat
C:\temp\test 2\data
C:\temp\test 2\libs
C:\temp\test 2\libs\ace1
C:\temp\test 2\libs\ace2
C:\temp\test 2\libs\lib 1
C:\temp\test 2\libs\lib 2
C:\temp\test 2\libs\ace1\datei 1.dat
C:\temp\test 2\libs\ace1\datei 2.dat
C:\temp\test 2\libs\ace1\datei 3.dat
C:\temp\test 2\libs\ace2\datei 1.dat
C:\temp\test 2\libs\ace2\datei 2.dat
C:\temp\test 2\libs\ace2\datei 3.dat
C:\temp\test 2\libs\lib 1\datei 1.dat
C:\temp\test 2\libs\lib 1\datei 2.dat
C:\temp\test 2\libs\lib 1\datei 3.dat
C:\temp\test 2\libs\lib 2\datei 1.dat
C:\temp\test 2\libs\lib 2\datei 2.dat
C:\temp\test 2\libs\lib 2\datei 3.dat
C:\temp\test 3\data
C:\temp\test 3\libs
C:\temp\test 3\libs\ace1
C:\temp\test 3\libs\ace2
C:\temp\test 3\libs\lib 1
C:\temp\test 3\libs\lib 2
C:\temp\test 3\libs\ace1\datei 1.dat
C:\temp\test 3\libs\ace1\datei 2.dat
C:\temp\test 3\libs\ace1\datei 3.dat
C:\temp\test 3\libs\ace2\datei 1.dat
C:\temp\test 3\libs\ace2\datei 2.dat
C:\temp\test 3\libs\ace2\datei 3.dat
C:\temp\test 3\libs\lib 1\datei 1.dat
C:\temp\test 3\libs\lib 1\datei 2.dat
C:\temp\test 3\libs\lib 1\datei 3.dat
C:\temp\test 3\libs\lib 2\datei 1.dat
C:\temp\test 3\libs\lib 2\datei 2.dat
C:\temp\test 3\libs\lib 2\datei 3.dat

In diesem Versuchsaufbau, der später der Produktivumgebung entspricht, sollen die fett markierten Verzeichnisse mit allen Dateien darin gelöscht werden. Die Ace-Libs im Hauptordner soll bestehen bleiben und die libs-Unterverzeichnisse mit anderen libs eben auch.
Bitte warten ..
Mitglied: demonllama
22.03.2007 um 10:27 Uhr

C:\temp\ace\ace1\
C:\temp\ace\ace2\
C:\temp\ace\ace1\datei 1.dat

Mir ist durch mehrmaliges editieren und aktualisieren übrigens ein Zeilenumbruchfehler entstanden, den ich nicht mehr beheben kann. Mal schauen ob die Zeilen im Zitat auch "defekt" sind.
Bitte warten ..
Mitglied: Biber
22.03.2007 um 13:27 Uhr
So, demonllama,

diese marode Formatierung in Deinem letzten Post habe ich geflickt..

Abgesehen davon: der Oneliner für Deine Anforderung sollte dann dieser sein:
[Demo am CMD-Prompt, bitte so Copy&Paste'n zum Test
01.
>for /D  %i in (c:\temp\*) do @for /d  %j in ("%i\*") do @if "%~nxj" GEQ "ace" if "%~nxj" LSS "aceZ" @echo rd /s /Q "%~j"
Falls Das so passt---> in eine Batchdatei kopierien und alle einfachen durch doppelte Prozentzeichen ersetzen.
Aber poste erstmal bitte die Ausgabe dieser Anweisung auf Deinem Rechner.

Gruss
Biber
Bitte warten ..
Mitglied: demonllama
22.03.2007 um 13:31 Uhr
Mit dem Befehl würde er genau die Verzeichnisse löschen die auf jeden Fall bestehen bleiben sollen.

Die Ausgabe bei mir ist dann:

rd /s /Q "c:\temp\ace\ace1"
rd /s /Q "c:\temp\ace\ace2"
Bitte warten ..
Mitglied: Biber
22.03.2007 um 15:22 Uhr
Hmm, demonllama,

das interpretier' ich mal so, dass wir es lieber anders herum machen sollten..?

Bitte Copy&Paste noch einmal:
01.
 
02.
(=15:21:49  D:\temp=) 
03.
>for /D  %i in ("Y:\temp\*") do @if "%~nxi" NEQ "ace" cmd /c @for /f "delims=" %j in ('dir /s /b /a:d "%i\ace*"') do @echo rd /s /Q "%~j"
Gruss
Biber
Bitte warten ..
Mitglied: demonllama
22.03.2007 um 15:32 Uhr
Das ist nahezu perfekt! Sehr geil. Wer hätte gedacht das soetwas in einer Zeile geht...
In meiner Testumgebung hat's wunderbar geklappt.
Ein Traum wäre es jetzt noch das von jedem beliebigen Ort auszuführen (also "Y:\temp\" auch variabel zu machen) und dort dann eben die entsprechenden Verzeichnisse zu killen, aber das ist nur ein "delighter".

Wie auch immer, ich küsse dem Biber die Füße! Vielen Dank!
Denn das hätte ich so in Monaten des "Batch-Studiums" nicht hinbekommen.
Bitte warten ..
Mitglied: Biber
22.03.2007 um 16:07 Uhr
Na, diese Feinheiten sind jetzt kein Problem mehr, wenn das Gerüst steht.

Packen wir es in einen Batch:
01.
::-- snipp DeleteAllAces.bat  
02.
@if [%1]==[] %0 c:\temp 
03.
@for /D  %i in ("%~1\*") do ( 
04.
    @if "%%~nxi" NEQ "ace" cmd /c @for /f "delims=" %%j in ('dir /s /b /a:d "%%i\ace*"') do ( 
05.
     @<b>ECHO</b> rd /s /Q "%%~j" 
06.
)) 
07.
::---- snipp DeleteAllAces.bat 
[Ungetestete Skizze. Das fette ECHO ist nur zum Testen wie immer .]
Wenn dieser Batch OHNE Parameter aufgerufen wird, führt er seine Aktionen in c:\temp aus.
Bei Aufruf als DeleteAllAces "Y:\Eigene Dateien\MyAces" führt er den Krams in "Y:\Eigene Dateien\MyAces" aus.

Kann ich den Thread schliessen?

Gruss
Biber
Bitte warten ..
Mitglied: demonllama
23.03.2007 um 13:26 Uhr
Ja, die Tür kann zu. Vielen Dank für deine Hilfe!

Gruß

DemonLlama
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Bei freigegebene Verzeichnisse in C:temp und Unterverzeichnisse Freigabe löschen

gelöst Frage von wk3963Batch & Shell3 Kommentare

Hallo, Aus Sicherheitsgründen soll ich bei WIN7 Rechnern alle Freigaben in C:\Temp und in Unterverzeichnissen schließen. Ich muss das ...

Batch & Shell

Bestimmte Verzeichnisse löschen via Powershell

Frage von killtecBatch & Shell8 Kommentare

Hallo, ich habe ein Verzeichnis und möchte das gern via Powershell leeren. Genauer gesagt, sind in diesem Verzeichnis nochmal ...

Batch & Shell

Lösche Inhalt in bestimmten Unterordner wenn älter als

gelöst Frage von KnuefiBatch & Shell7 Kommentare

Hallo, ich benötige eure Hilfe. Ich habe unterstehendes Script, leider funktioniert es nicht. Es wird nichts gelöscht. Was habe ...

Batch & Shell

Powershell Excel bestimmten Inhalt löschen

gelöst Frage von TastuserBatch & Shell4 Kommentare

Hallo! Ich habe eine Excel-Tabelle (Tabelle1), die in Zellen B3 bis B15 und D3 bis D15 ein ü enthält. ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 2 TagenWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 2 TagenAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 3 TagenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 3 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Router & Routing
Router auf Orginal Firmware zurück flashen mit Tftpd
Frage von ILeonardRouter & Routing21 Kommentare

Hallo, Ich habe zwei Router, einmal TP-Link 841n v11 und TP-Link 940N v5. Ich wollte fragen, ob jemand mir ...

Router & Routing
WRT keine Verbindung zum Web Interface
gelöst Frage von ILeonardRouter & Routing18 Kommentare

Hallo, Ich habe einen TP-Link WR841n mit wrt geflasht, das Problem ist ich kann mich mit 192.168.1.1 nicht verbinden. ...

TK-Netze & Geräte
Telefonie zweier Fritzboxen mit je eigenem DSL Anschluss verbinden
Frage von hannsgmaulwurfTK-Netze & Geräte10 Kommentare

Hallo zusammen, ich habe hier einen Haushalt mit zwei Anschlüssen. Einmal ISDN, einmal DSL. An jedem Anschluss hängt eine ...

Windows Server
Standortvernetzung zu einem Strato VServer (Windows)
Frage von matzefratze81Windows Server10 Kommentare

Moin, ich komme aus einem Enterprise-Umfeld und habe den Fehler gemacht, dass ich mich auf ein kleines Unternehmen eingelassen ...