
Ich habe viele Archivordner, in denen die Sicherungsdateien gespeichert sind. Jeder Ordner wird täglich größer.
Ich muss alle Dateien außer den jeweils N letzten Kopien löschen, wobei N durch eine Variable aus der übergeordneten Schleife definiert wurde.
%%a ist eine Zahl aus der übergeordneten Schleife. Verwenden Sie dann eine weitere For-Schleife zum Löschen.
for /F "usebackq skip=%%a" %%x in (`dir /TW /O:-D /B %%b`) do del %%x
Die Fehlerberichte
%a" war zu diesem Zeitpunkt unerwartet.
Wie kann ich das beheben?
Antwort1
Da es nicht möglich ist, eine Variable für zu verwenden skip
, müssen Sie diese Einschränkung irgendwie umgehen.
Einige Alternativen:
- Hardcodieren Sie dieN(Anzahl der zu behaltenden Kopien) durch Einfügen des tatsächlichen Wertes in die For-Schleifen
- Anstatt einen Inline-
dir
Befehl zu verwenden, um die Liste der Einträge zu erstellen, implementieren Sie ein anderes Skript, das nur die Einträge ausgibt, die Sie löschen möchten (dann können Sie möglicherweise IhreNan nur einem Ort) - Leiten Sie die Ausgabe
dir
an ein Dienstprogramm weiter, das dieNZeilen vom Anfang der Auflistung (mir ist so etwas nicht bekannt, aber es ist möglich, dass einige der GNU-Dienstprogramme – von denen es eine Windows-Portierung gibt – das könnten).
Antwort2
Sie können eine Variable im Parameterteil einer for
Schleife verwenden, jedoch keine Variable aus einer anderen for
Schleife. Hier ist ein etwas konstruiertes Beispiel, das den Inhalt des %TEMP%
Verzeichnisses 10 Mal auflistet und bei jedem Durchlauf der Schleife eine weitere Zeile überspringt. Dies sollte ein repräsentatives Beispiel für das sein, was Sie zu tun versuchen:
@echo off
for /l %%a in (1,1,10) do call :innerloop %%a > %%a.txt
goto :EOF
:innerloop
for /f "usebackq skip=%1" %%i in (`dir /s /a /b "%TEMP%"`) do echo %%i
Antwort3
Dies wäre ein gutes Skript zum Schreiben in PowerShell.
$n = 5
$FoldersList = Dir e:\Archive
foreach($Folder in $FoldersList)
{
Dir $Folder |
Sort-Object CreationTime -Descending |
Select-Object -Skip $n |
Remove-Item -whatif
}
In diesem Fall sorgt Powershell für ein sehr sauberes und leicht zu wartendes Skript.
Testen Sie es, bevor Sie es in Ihrem Archiv ausführen, da ich es auf meiner Seite nicht viel getestet habe. Entfernen Sie es, -WhatIf
wenn Sie bereit sind.