cmd.exe, verschachtelte For-Schleife, die Variable kann nicht in Optionen wie skip= verwendet werden

cmd.exe, verschachtelte For-Schleife, die Variable kann nicht in Optionen wie skip= verwendet werden

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:

  1. Hardcodieren Sie dieN(Anzahl der zu behaltenden Kopien) durch Einfügen des tatsächlichen Wertes in die For-Schleifen
  2. Anstatt einen Inline- dirBefehl 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)
  3. Leiten Sie die Ausgabe diran 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 forSchleife verwenden, jedoch keine Variable aus einer anderen forSchleife. 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, -WhatIfwenn Sie bereit sind.

verwandte Informationen