2016-03-22 5 views
1

Im Voraus: Ich bin neu im Batch oder Programmierung im Allgemeinen, also bitte erklären Sie so viel wie möglich.Batch/CMD-Skript zum Löschen von Ordnern, aber mit Ausnahme von mehr als einem

Mein Problem:
ich alle Ordner löschen möchten nichtnamens X und Y in einem Verzeichnis Z (ex. D: \ Test \ z)

also lasst uns sagen Z diese enthält Ordner:

  • Backup
  • Ressourcen
  • project1
  • project2
  • project3

ich nur Backup und Ressourcen aus Löschung über ein Skript ausschließen bräuchten zu.
Ich suchte mehrere Lösungen für das Löschen nicht nur einen Ordner mit einem bestimmten Namen, aber ich weiß nicht, ob es für mehrere Werte mit Batch möglich ist.

Antwort

0

nicht getestet:

@echo off 

set "root_dir=C:\Z" 
set "exclude_list=backup resources" 
pushd "%root_dir%" 
for /f "tokens=* delims=" %%# in ('dir /b /a:d^| findstr /v "%exclude_list%"') do (
    echo rd /s /q "%%~f#" 
) 

wenn dies ok sieht die echo in der letzten Zeile löschen Löschen zu aktivieren.

Wenn alle Ordner, die Sie wie project* löschen möchten, können Sie auch versuchen:

for /d %%a in ("project*") do rd /s /q "%%~fa" 
+0

Vielen Dank.Das hat gut funktioniert. Kannst du das Drehbuch im Detail erklären? –

+0

Diese Methode hat zwei Probleme: Es erfordert genaue Übereinstimmung, um die Ordnernamen zu finden (das ist leicht zu lösen, indem '/ I' Groß- und Kleinschreibung im Befehl 'findstr' ignoriert) und auch Ordner, die teilweise mit einem beliebigen Namen übereinstimmen die Ausschlussliste. Zum Beispiel würde es auch "backup1", "backupA", "backupETC" Ordner ausschließen. – Aacini

0
@echo off 
setlocal EnableDelayedExpansion 

rem Define working variables 
set "dir=D:\Test\z" 
set "exclude=/backup/resources/" 

rem Change current dir to working dir 
cd /D "%dir%" 
rem Process all folders in this dir 
for /D %%f in (*) do (
    rem If current folder is not in "exclude" var 
    if "!exclude:/%%f/=!" equ "%exclude%" (
     rem Delete it 
     ECHO rd /s /q "%%f" 
    ) 
) 

Diese Methode verwenden interne cmd.exe nur Befehle, so dass es schneller als andere Methoden ausführen, die extern verwenden .exe Dateien (wie findstr.exe).

Die Art und Weise zu erkennen, ob ein Name in den Variablen auszuschließen versucht, von ihm solchen Namen zu löschen: "%exclude:/%%f/=%": wenn das Ergebnis auf die ursprünglichen Variableninhalte gleich ist, wird der Ordner nicht da war. Diese Methode ist sehr einfach und effizient und funktioniert nicht von Fall zu Fall, so dass es keinen /I ignorieren Fallschalter im if Befehl erfordert.

Die Namen sind durch Schrägstriche begrenzt, um Probleme durch teilweise Namensübereinstimmungen zu vermeiden. Aus diesem Grund ist der %%f Teil in Schrägstrichen im if Befehl enthalten.

Beachten Sie, dass der Wert %%fin jeder Iteration des Befehls for ändern. Aus diesem Grund ist die exclude Variable von Ausrufezeichen statt Prozentzeichen umgeben und der setlocal EnableDelayedExpansion Befehl wird zu Beginn gegeben; Andernfalls würde die% Erweiterung% nur einmal durchgeführt werden, bevor der for Befehl Iterationen starten. Sie können in diesem Forum nach einer "verzögerten Erweiterung" suchen, um diesen Punkt näher zu erläutern.

+0

Danke für die Einsicht und diese spezifische Lösung. Die Lösung, die von npocmaka zur Verfügung gestellt wurde, hat es für meinen Anwendungsfall getan, aber ich werde das Skript anpassen, um narrensicherer zu sein und für künftige Anwendungsfälle anwendbar zu sein. –

Verwandte Themen