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.
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
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
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. –