Runtergebrochen auf möglichst identischen Ablauf in etwa sowas:
PowerShell:
get-childitem -literalpath $Workdir -Force |
Where-Object { ($_.Attributes -band [System.IO.FileAttributes]::Directory) -eq 0} |
Sort-Object LastWriteTime -Descending |
select-object -skip $VersionPTag |
Remove-Item -WhatIf
Was das tut:
1. Beschaffe Liste von Dateien und Ordnern aus $Workdir, nicht rekursiv, aber einschließlich versteckten Objekten. (Ohne -Force fallen die versteckten Objekte raus.)
2. Eine exakte Abbildung von /A-D.
Get-ChildItem kennt auch -File. Damit bekommt man nur Dateiobjekte (keine Ordner). Allerdings gibts in Windows noch ganz bissel mehr Dateiobjektarten wie Symlinks, Reparse Points und so weiter.
Vorfiltern ist immer besser als Nachfiltern, daher, wenn es wirklich ausschließlich um Dateien geht, Zeile 2 raus und Zeile 1 um -File ergänzen.
Konkret wird in Zeile zwei geschaut, ob das D Flag auf dem Dateisystemobjekt gesetzt ist -- das Objekt also ein Verzeichnis ist oder nicht -- und das der Fall ist, schließe das Ergebnis vom Filter aus. Dabei ist .Attributes ein Bitfeld und System.IO.FileAttributes ein Enum, der darauf paßt; -band macht dann ein binäres Und auf dem Bitfeld und liefert "0" wenn das Flag fehlt und "Directory" wenn es gesetzt ist.
3. Sortiert gemäß /O-D. Bitte beachten daß man in PS nicht unbedingt automatisch nach Letztem "irgendwas" sortieren kann, sondern man muß das wirklich auswählen, hier LastWriteTime. LastAccessTime und LastModifiedTime ;gibts auch (plus ein paar andere). -Descending sortiert dann absteigend.
4. Überspringe die Anzahl in $SkipPTag. Darauf achten daß in dieser Variable ein numerischer Wert steht.
5. Entferne die gefundene Liste der Dateien. -Whatif sorgt dafür, daß sie stattdessen angezeigt wird - sozusagen dryrun --- für die Produktion muß das dann raus.
PS arbeitet mit Listen, man benötigt Schleifen also einen ganzen Ticken weniger als anderswo. Andererseits muß man aufpassen was man erwischt. Erst testen, besonders wenn es um irreversible Veränderungen geht, die ein Scriptblock erledigen soll.