nickoh
Goto Top

Script zum Löschen von Dateien nach Datum und Uhrzeit

Hallo, ich möchte auf einem FritzNAS (USB-Stick) täglich - vom Vortag - aber nur bestimmte *.mp4 Dateien innerhalb einer bestimmten Uhrzeit, z. B. von 13:00 Uhr bis 00:00 Uhr finden und löschen. Ich habe schon gegoogelt habe aber nichts mit Uhrzeit(en) sondern nur Datum (ganze Tage) hierzu gefunden. Wer kann mir hier helfen, eine Vorlage oder dgl. zur Verfügung stellen. Ich bin nicht ganz unbedarft aber kein Programmierer etc.

Vielen Dank im Voraus!

Schönen Sonntag noch …

Content-Key: 44242030959

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

Printed on: June 2, 2024 at 14:06 o'clock

Member: mayho33
Solution mayho33 Sep 03, 2023 updated at 10:26:45 (UTC)
Goto Top
Hi,

Warum nochmal genau VBS? Das was in VBS mindestens ein langsamer 15-Zeiler wäre ist in Powershell ein schneller 1-Zeiler bis 3-Zeiler

[datetime]$start = '2016-01-01 00:00:00'  
[datetime]$end = '2016-02-01 00:00:00'  
Get-ChildItem -Path "<your path oder network-path>" -Include "*.mp4" -Recurse | Where-Object `  
{$_.LastWriteTime -ge $start -and $_.LastWriteTime -le $end} | Remove-Item

mit dem Argument -Depth kannst du sogar die Pfadtiefe festlegen.
Get-ChildItem -Path "<your path oder network-path>" -Include "*.mp4" -Recurse -Depth 4 | `  
    Where-Object {$_.LastWriteTime -ge ([datetime]'2016-01-01 00:00:00') -and $_.LastWriteTime -le ([datetime]'2016-02-01 00:00:00')} | `  
    Remove-Item
Grüße
Member: NickOH
NickOH Sep 03, 2023 at 10:39:55 (UTC)
Goto Top
Hallo, und danke für den Vorschlag!
Welche Art der Umsetzung ist mir eigentlich egal, dachte nur, dass das aufgrund Komplexität anders nicht möglich wäre.

Ich probiere das heute noch aus … Danke!

!! Experten sind eben (doch) Experten !!
Member: NickOH
NickOH Sep 03, 2023 at 11:08:37 (UTC)
Goto Top
@mayho33 - Frage: Muss ich die Befehle einzeln im Eingabefenster mit Admin-Rechten eingeben oder kann das auch als normaler User funktionieren.

Wenn ich das zeitlich in der Nacht, als Task, ablaufen lassen möchte, kann ich die einzelnen Befehle in einer Datei zusammenfassen und welche Endung ist notwendig (*.bat ?).
Member: NickOH
NickOH Sep 03, 2023 at 11:32:55 (UTC)
Goto Top
Okay, habe die Infos gefunden …
Member: mayho33
Solution mayho33 Sep 03, 2023 updated at 12:52:32 (UTC)
Goto Top
Zitat von @NickOH:

@mayho33 - Frage: Muss ich die Befehle einzeln im Eingabefenster mit Admin-Rechten eingeben oder kann das auch als normaler User funktionieren.
Powershell ließt ein Script zeilenweise. Jede neue Zeile ist gleichzeitig ein Befehlsabschluss. Würdest du alles in einer Zeile schreiben müsstest du jeden Befehl mit einem ";" abschließen.
Du findest einen "Pipe"-Parameter ( | ) und einen "BackTick"-Parameter ( ` ). Der BackTick kann dazu genutzt werden ein Script leserlicher zu gestalten, weil damit ein langer Befehls in mehrere Zeilen aufgeteilt werden kann bevor der Befehl endet.

bsp:
Get-ChildItem -Path "<your path oder network-path>" `  
    -Include "*.mp4" `  
    -Recurse | Where-Object `  
        {$_.LastWriteTime -ge $start -and $_.LastWriteTime -le $end} | `
    Remove-Item

Powershell gibt jedes Ergebnis nicht einfach als Zeichenfolge aus wie etwa Batch und großteils auch VBS sondern als Object mit Eigeschaften. Der Pipe-Parameter übernimmt das Ergebnis-Object aus dem vorherigen Befehl und übergibt es direkt dem nächsten. Das bedeutet, dass ein Object aus dem Ergebnis direkt angesprochen und weiterverarbeitet werden kann mit einem Object-Platzhalter ( $_ ).

Hat ein Object mit Namen Anstrich also 3 Properties mit Namen Farbe, Dicke und Laenge...
#nur ein Beispiel!!
$Anstrich = @()

#Object erstellen
$tmp = New-Object PSObject
#Properties erstellen und füllen
$tmp | Add-Member Noteproperty -Name Farbe -Value "DarkGrey"  
$tmp | Add-Member Noteproperty -Name Dicke -Value 2
$tmp | Add-Member Noteproperty -Name Laenge -Value 21
#Object einem Übergeordneten Object zuweisen
$Anstrich += $tmp

$tmp = New-Object PSObject
$tmp | Add-Member Noteproperty -Name Farbe -Value "Orange"  
$tmp | Add-Member Noteproperty -Name Dicke -Value 1
$tmp | Add-Member Noteproperty -Name Laenge -Value 49
$Anstrich += $tmp

$tmp = New-Object PSObject
$tmp | Add-Member Noteproperty -Name Farbe -Value "Blue"  
$tmp | Add-Member Noteproperty -Name Dicke -Value 4
$tmp | Add-Member Noteproperty -Name Laenge -Value 87
$Anstrich += $tmp

cls
$Anstrich
ergebnis:
farbe
...so kannst du die wie folgt ansprechen:
Bsp:
$Anstrich | Where-Object {$_.Farbe -match "grey"}  
#oder
$Anstrich | ? {$_.Farbe -match "grey"}  
farbe2

Du musst das script mit den Rechten laufen lassen die auf dem Ziel erlaubt sind. Wenn du also mit User XX2 auf dem Pfad löschen, moven darfst mit XX5 aber nicht, musst du mit XX2 das Script laufen lassen

Wenn ich das zeitlich in der Nacht, als Task, ablaufen lassen möchte, kann ich die einzelnen Befehle in einer Datei zusammenfassen und welche Endung ist notwendig (*.bat ?).
Ein Powershell-Script hat normalerweise die Dateiendung ".PS1". Einfach so kopieren und ams PS1-Datei speichern.

Sicherheitshalber solltest du jeden Code den du aus dem Browser kopierst vorher in das gute alte Notepad (Windows-Standard-Editor) kopieren und dann aus diesem Editior dort hin wo du es brachst. Der Grund ist folgender:
Im Browser wird Text eventuell in einer anderen Schrift formatiert. WEnn du den 1:1 übernimmst, bekommt du eventuell einen Laufzeitfehler der nicht leicht zu finden ist. Im Editor hast du immer eine kompatible Schrift sofern du da nichts geändert hast.

Gutes Gelingen!
Member: NickOH
NickOH Sep 03, 2023 at 13:21:36 (UTC)
Goto Top
Danke für deine Unterstützung und den nützlichen Hinweisen!

Wie kann ich das mit dem Datum automatisieren, z. B. die Syntax um das vom heutigen Datum 2 Tage abgezogen werden. Die Zeit kann ich ja statisch als Parameter vorgeben.

Kannst du mir da bitte nochmal helfen?

Danke und Grüße
Mitglied: 7907292512
Solution 7907292512 Sep 03, 2023 updated at 14:06:27 (UTC)
Goto Top
Zitat von @NickOH:

täglich - vom Vortag - aber nur bestimmte *.mp4 Dateien innerhalb einer bestimmten Uhrzeit, z. B. von 13:00 Uhr bis 00:00 Uhr finden und löschen.

# Basisordner 
$folder = "\\fritz.box\fritz.nas\Videos"  
# von gestern um 13:00
$start = (get-date "13:00").AddDays(-1)  
# bis heute 0:00 Uhr
$end = (get-date).Date
# Dateien die zutreffen löschen
Get-ChildItem $folder -File -Recurse -Filter *.mp4 | ?{$_.LastWriteTime -ge $start -and $_.LastWriteTime -le $end} | remove-item -force -verbose

Gruß sid
Member: NickOH
NickOH Sep 03, 2023 at 14:00:49 (UTC)
Goto Top
@7907292512: Vielen, vielen Dank! Wird probiert und gebe gern danach eine positive Rückmeldung.
Gruß O.