for /f "skip=%VersionenTage%" %%i in ('dir /b /o-n /ad in PowerShell umstetzen.

schanzerin

Newbie
Registriert
Nov. 2022
Beiträge
3
Hallo zusammen,

ich breuchte mal euere Hilfe.

Könnt ihr mir sagen wie ich follgenden Batch-Datei Inhalt in Powershell umsetzen kann:

Batch-Datei Powershell
%VersionPTag%=8 -> $VersionPTag = 8
%workdir%="Pfad zum Backupordner"
-> $workdir = "Pfad zum Backupordner"



Bei dieser Zeile komme ich nicht weiter:

for /f "skip=%VersionPTag% tokens=* delims=" %%a in ('dir /B /A-D /O-D "%workdir%\."') do del "%workdir%\%%a"


Vielen Dank schon mal im Voraus.

Liebe Grüße aus Ingolstadt

Max
 
Damit ich es nicht selber testen muss: Was soll diese Zeile denn machen?
 
Folgendes müsste gehen:
PowerShell:
Get-ChildItem $workdir | where {$_.Name -notmatch $VersionPTag  }  | Remove-Item
 
kartoffelpü schrieb:
Damit ich es nicht selber testen muss: Was soll diese Zeile denn machen?


Hintergrund der Befehlszeile:

Aktuell werden mit dem Teil der Batch-Datei:
Alle zwei Stunden Dateien eines Arbeitsverzeichnisses in ein 7zip-Archiv gepackt, das Zip-Archiv wird anschließend in einem Backupordner mit dem aktuellen Datum gelegt.



Die Zeile soll folgendes Machen:

Um die Anzahl der Backups pro Tag zu begrenzen.

Wird anschließend der Inhalt des Backupordners nach Änderungsdatum sortiert und es werden im aktuellen Beispiel die nur die neusten 8 zip-Archive des heutigen Tages beibehalten.
Die älteren Archive werden gelöscht.

Die Anzahl wie viele Archive beibehalten werden ist in folgendem Attribut festgelegt:

%VersionPTag%=8
 
Runtergebrochen auf möglichst identischen Ablauf in etwa sowas:
PowerShell:
get-childitem -literalpath $Workdir -Force  | #"dir" + "schließe HIDDEN mit ein"
Where-Object  { ($_.Attributes -band [System.IO.FileAttributes]::Directory) -eq 0} | # siehe unten
Sort-Object LastWriteTime -Descending | #"/o-d"
select-object -skip $VersionPTag | # "skip=%versionptag%
Remove-Item -WhatIf # do del ...
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.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
Zurück
Oben