volker01
Goto Top

For Schleife Windows - Reihenfolge umdrehen

for Schleife Windows - Reihenfolge umdrehen ...

Ich suche in einem übergeordneten Verzeichnis Unterverzeichnisse,
dabei sollen die 'n' neuesten übersprungen werden.

Der Rest muss aber in umgekehrter Reihenfolge abgearbeitet werden,
also zuerst das älteste Verzeichnis, dann das zweitälteste etc.
Ich finde keine Lösung dafür.

set CLean1SkipDir=2
set Clean1DirPath=D:\Backup

for /f "skip=%CLean1SkipDir% delims=" %%a in ('dir /B /AD /O-D "%Clean1DirPath%"') do call :Remove_C "%%a"  

	set CountUV=0
	:Remove_C
	set /a CountUV+=1
	echo.
	
	rem do something ...
	
	:Next_C_Remove
	set /a DelDirCnt=%DelDirCnt%+1
	goto :eof

Content-ID: 8829175449

Url: https://administrator.de/forum/for-schleife-windows-reihenfolge-umdrehen-8829175449.html

Ausgedruckt am: 23.12.2024 um 12:12 Uhr

NordicMike
NordicMike 05.01.2024 um 11:51:39 Uhr
Goto Top
Du machst die Abfrage direkt in der FOR Schleife, du bist also auf das festgelegt was der DIR Befehl liefert und kannst es nicht ändern.

Du musst zunächst die DIR Abfrage machen und die Ergebnisse in ein Array zu schreiben. Dann sortierst du das Array nach dem Datum und wirfst die ersten zwei Einträge raus. Danach sortierst du das Array nach umgekehrten Datum und beginnst mit der FOR Schleife mit der eigentlichen Verarbeitung.
volker01
volker01 05.01.2024 um 13:20:05 Uhr
Goto Top
... die Ergebnisse in ein Array zu schreiben ...
Geht das in einer bat?
10138557388
Lösung 10138557388 05.01.2024 aktualisiert um 16:01:26 Uhr
Goto Top
Batch
@echo off
set Clean1SkipDir=2
set "Clean1DirPath=D:\Backup"  

for /f "tokens=1 delims=:" %%a in ('dir /B /AD "%Clean1DirPath%" ^|findstr /n "^" 2^>nul') do set /a cnt=%%a-%Clean1SkipDir%  
for /f "tokens=1,* delims=:" %%a in ('dir /B /AD /OD "%Clean1DirPath%" ^|findstr /n "^" 2^>nul') do (  
    if %%a LEQ %cnt% (
        echo Do something with "%%b"  
    )
)

Wieso man sich immer noch mit Batch den besten Freund verknotet? Aber is ja eh Freitag da darf man nicht allzuviel erwarten 🫠... Besser gleich die PowerShell nehmen wenn's schon Winblows sein muss ...
Get-ChildItem "d:\backup" -Directory | sort LastWriteTime | select -Skiplast 2 | foreach {  
     "Do something with $($_.Fullname)"  
}
Pj
NordicMike
NordicMike 05.01.2024 um 13:34:31 Uhr
Goto Top
volker01
volker01 05.01.2024 aktualisiert um 15:30:52 Uhr
Goto Top
Zitat von @10138557388:

Wieso man sich immer noch mit Batch den besten Freund verknotet? Aber is ja eh Freitag da darf man nicht allzuviel erwarten 🫠... Besser gleich die PowerShell nehmen wenn's schon Winblows sein muss ...
Pj

... Weil es Teil eines großen bat Scripts ist ...
Brillante Lösung für eine batch ... geht doch face-wink

Jetzt muss man nur noch dafür sorgen, dass das Script ohne Unterverzeichnisse nicht abstürzt:

set Clean1SkipDir=2
set Clean1DirPath=T:\testclean

set /A dir_C_cnt=0
for /F %%i in ('dir "%Clean1DirPath%" /B /Ad 2^>nul') do set /A dir_C_cnt=dir_C_cnt+1  
echo Enthaltene Unter-Verzeichnisse:   "%dir_C_cnt%" directories;  

if not %dir_C_cnt% gtr 0 echo nichts zu tun...&& goto CleanDirEnd

for /f "tokens=1 delims=:" %%a in ('dir /B /AD "%Clean1DirPath%" ^|findstr /n "^"') do set /a cnt=%%a-%Clean1SkipDir%  
for /f "tokens=1,* delims=:" %%a in ('dir /B /AD /OD "%Clean1DirPath%" ^|findstr /n "^"') do (  
    if %%a LEQ %cnt% (
        echo Do something with "%%b"  
    )
)

:CleanDirEnd