2017-07-07 3 views
0

Ich möchte für einen bestimmten Dateinamen [* dwg] im „Service“ Ordner und löschen Sie alle Dateien suchen, sondern die neueste:Batch Dateien löschen und halten Neueste One von Subdirectories

  • G: \ Backup \ Besitzer \ Project1 \ Service
  • G: \ Backup \ Besitzer \ Projekt2 \ Service
  • G: \ Backup \ Besitzer \ Project3 \ Service

Dies ist, was ich von einer verschiedenen Recherche bisher zusammengestellt aber es war nicht in der Lage, es innerhalb des Unterverzeichnisses zu suchen ectories. Jede Hilfe oder jeder Tipp, der mich auf den richtigen Weg weist, wird wirklich geschätzt!

@echo off &setlocal 
set folder=G:\Backup\Owner 
pushd "%folder%" 
for /f "skip=1 tokens=*" %%i in ('dir /s /a:-d-s /o:-d *.DWG') do @del "%%i" 
popd 
pause 
+1

Möchten Sie nur eine Datei für alle Ordner oder einen Ordner pro Projekt behalten? Um zu sehen, was das Verzeichnis auswählt, führe es in einem offenen cmd-Fenster aus, um zu sehen, was das del tun würde, es mit einem echo-Befehl voranzustellen. – LotPings

+0

Ja, LotPings wirft eine kritische Frage auf. Es ist trivial, die neueste Datei aus jedem Unterordner zu behalten. Das Beibehalten nur einer einzigen Datei (der letzten Datei in allen Unterordnern) ist mit dem Batch viel schwieriger. – dbenham

+0

Vielen Dank für Ihre Eingabe. Unter Project1 habe ich drei zusätzliche Ordner. Ich möchte NUR Dateien innerhalb des Service-Ordners löschen, daher habe ich beschlossen, * .dwg aufzunehmen, um nur auf diese Datei zu zielen. –

Antwort

0

Der erste und wichtigste Frage:

ändern @del-ECHO del

Dies wird einfach Bericht die Streichungen vorgeschlagen, führen nicht wirklich das Löschen.

Hinweis: @ vor einem Befehl unterdrückt einfach die Befehlsprotokollierung. Sobald @echo off ausgeführt wurde, ist es redundant.

Jetzt, um das Problem anzugehen (ich nehme an) leave-the-latest-1-pro-Verzeichnis.

dir /s /B /a:-d /o:-d *.DWG 

erzeugt ein Verzeichnis-Eintrag ohne Verzeichnis-Namen (/ a-d) in umgekehrter chronologischer Reihenfolge (/ o-d) der Dateiname nur (/ b) Rekursion in Unterverzeichnissen (/ s). Der Doppelpunkt in Optionen ist optional, der Fall ist irrelevant. Die filemask * .dwg means "all names ending in .dwg`“(wiederum Fall ist irrelevant)

Diese eine Auflistung wie

d:\dirname\subdir\latest.dwg 
d:\dirname\subdir\2ndlatest.dwg 
d:\dirname\subdir\3rdlatest.dwg 
d:\dirname\subdir2\latest.dwg 
d:\dirname\subdir2\2ndlatest.dwg 
d:\dirname\subdir2\3rdlatest.dwg 

Und das Projekt ergeben würde erscheint nur die ersten davon in jedem Unterverzeichnis zu verlassen, um zu sein , also müssen wir einen Schalter, uns zu sagen, dass das Unterverzeichnis geändert hat.

%%~pi den Pfad von %%i bietet, so können wir eine Änderung dort erkennen.

wir können Setzen Sie einfach eine Flagge durch set eine Variable auf gut, 1 und 0 oder Y und N oder was auch immer - zwei verschiedene Werte.

Die Schwierigkeit, die wir begegnen wird Flaggen wegen des delayed expansion Problems der Interpretation (Search SO die Anlage in der oberen Leiste für viele Artikel über diese verwenden)

ich umgehen das delayedexpansion Problem, indem Flag-Variablen entweder zu etwas oder nichts da diese Weise können sie durch if defined interpretiert werden, die Laufzeit Wert der variablen, nicht der anfänglichen Wert auf der arbeitet.

Daher

@ECHO Off 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
pushd "%sourcedir%" 
set "lastdir=" 
for /f "tokens=*" %%i in ('dir /s /B /a:-d /o:-d *.DWG') do (
CALL SET "keepflag=%%lastdir:%%~pi=%%" 
if NOT defined keepflag ECHO del "%%i" 
set "lastdir=%%~pi" 
) 
popd 
GOTO :EOF 

Sie benötigen würde die Einstellung von sourcedir zu ändern, um Ihre Umstände anzupassen.

lastdir wird zuerst auf nichts und dann die for Schleife ordnet jeder Name wiederum %%i gefunden.

Die call set Anweisung umgeht delayed expansion und führt SET "keepflag=%lastdir:%%~pi=%" wo %%~pi durch den Weg des %%i ersetzt wurde. Dies setzt keepflag auf das Ergebnis der [das letzte Verzeichnis ersetzen der Pfad des Dateinamens von nichts verarbeitet], die insgesamt nichts ist, wenn die Verzeichnisnamen übereinstimmen und etwas, wenn nicht.

Also, wenn keepflag enthält nichts dann der Verzeichnisname tat nicht ändern, so müssen wir die Datei (oder ECHO der Löschbefehl für die Sicherheit während des Tests) löschen. Wenn keepflag auf etwas eingestellt ist, dann ist dies die erste Datei in einem neuen Verzeichnis, also behalten wir es bei, indem wir del nicht ausführen.

Dann setzen wir einfach lastdir auf den Pfadnamen aus der Datei %%i. Auf diese Weise wird ein anderer Dateiname im selben Verzeichnis keepfile auf nichts setzen, aber eine Änderung des Verzeichnisses wird keepfile auf etwas setzen.

Verwandte Themen