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-Key: 8829175449

Url: https://administrator.de/contentid/8829175449

Printed on: April 28, 2024 at 16:04 o'clock

Member: NordicMike
NordicMike Jan 05, 2024 at 10:51:39 (UTC)
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.
Member: volker01
volker01 Jan 05, 2024 at 12:20:05 (UTC)
Goto Top
... die Ergebnisse in ein Array zu schreiben ...
Geht das in einer bat?
Mitglied: 10138557388
Solution 10138557388 Jan 05, 2024 updated at 15:01:26 (UTC)
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
Member: NordicMike
NordicMike Jan 05, 2024 at 12:34:31 (UTC)
Goto Top
Member: volker01
volker01 Jan 05, 2024 updated at 14:30:52 (UTC)
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