yan2021
Goto Top

Kleines Such und Lösch-Script für Datenlöschung erstellen

Hallo liebe User,

habe noch ein weiteres Thema...

Von unserem Serverlaufwerk (S) sollen alle Excel-Listen (*.xls*) gelöscht werden, deren Veränderungs-Datum vor dem 1.01.2012 liegt.
Grds. ist so ein Script ja nicht sooooo ein großes Problem. Aber wie beziehe ich mich in einem Script auf das Veränderungs-Datum - also das Datum, an dem die entsprechenden Dateien das letzte Mal verändert wurden?

Ein zweites Script (viell. geht auch Beides in einem) würde ich brauchen, um auf dem gleichen Laufwerk (S) alle "Word-Serienbrief-Dokumente" aufzuspüren und ebenso zu löschen, wenn sie älter sind, als 1.01.2012.
Hier frage ich mich jedoch, wie sage ich dem Script, dass es Word-Serienbrief-Dokumente suchen soll?

Am liebsten wäre mir eine Batchdatei (od. eben zwei).
Und... JA... ich weiß, dass PowerShell viel besser & neuer ist.
Aber ich kenne mich mit PS halt überhaupt nicht aus - mit Batch aber schon einigermaßen gut. face-smile

Grüße von
Yan face-wink

Content-Key: 1780164636

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

Printed on: April 26, 2024 at 13:04 o'clock

Member: Hubert.N
Hubert.N Jan 31, 2022 at 09:28:31 (UTC)
Goto Top
Guten Morgen

Was die Dateien mit Änderungsdatum betrifft: forfiles sollte können, was Du suchst.

Gruß
Member: Doskias
Doskias Jan 31, 2022 at 09:29:52 (UTC)
Goto Top
Moin,

immer wieder das gleiche mit dir face-wink. Poste doch erstmal was du schon hast. So aus dem nichts eine Anforderung umzusetzen ist nicht helfen.

Und... JA... ich weiß, dass PowerShell viel besser & neuer ist.
Einsicht ist immer gut

Aber ich kenne mich mit PS halt überhaupt nicht aus - mit Batch aber schon einigermaßen gut.
Das ist kein Argument. Das was du hier vorhast, kannst du mit PowerShell in einer Zeile erledigen. Mehr gehen auch, aber es geht auch in einer Zeile. Nutze das um dich mit PS vertraut zu machen und zu lernen. Wenn du immer auf dem Standpunkt PS kann ich nicht so gut wie Batch stehen bleibst, dann wirst du irgendwann vor einem Problem stehen, was du mit Batch nicht lösen kannst und PowerShell zwingend brauchst und dann wird es dir unter Zeitdruck noch schwerer fallen PowerShell zu lernen.

Gruß
Doskias
Member: Yan2021
Yan2021 Jan 31, 2022 updated at 10:23:01 (UTC)
Goto Top
Danke Euch für die schnellen Antworten.

@Hubert.N:
Danke für den Hinweis auf "forfiles". Zwar hilft mir das noch nicht wirklich weiter. Aber es ist schon ein Anfang.

@Doskias:
Danke auch Dir für die Belehrungen... face-wink

Posten was ich schon habe, ist deshalb schwierig, weil ich ja noch nichts habe.
Ich wußte ja eben nicht, wie ich z.B. nach dem Änderungsdatum suchen soll.

Ich würde mir das so vorstellen:

suche alle dateien *.xls* auf Laufwerk S:\ die vor dem 1.01.2012 verändert worden sind (od. alternativ -> die ab dem 1.01.2012 nicht mehr verändert wurden) und lösche diese.

Vielleicht würde es mit einem ähnlichen Code gehen, wie dem unten von mir eingestellten Code.
Dabei würden (wenn ich es richtig umgesetzt habe) zunächst mal alle Excel-Dokumente im Verzeichnis S:\ angezeigt, die älter sind als 1.01.2012 mit einem entspr. Hinweis.

forfiles S:\ /S /M *.xls* /D -01/01/2012 /C "cmd /c echo @file is outdated."  

Ob sich das dann auch speziell auf das VERÄNDERUNGS-Datum bezieht, ist mir noch unklar.

Zweites Beispiel:
Hier würde wohl nach dem Änderungsdatum 1.12.2012 gefiltert... (denke ich zumindest) face-wink

forfiles S:\ /S /M *.xls* /D -1.12.2012 /C "cmd /c echo @file wurde vor dem 1.12.2012 verändert"  

Sicher wäre eine Auflistung zunächst mal sinnvoll, bevor man die Dateien löscht face-smile

Das wäre dann wohl der Code für eine Löschung....??

Forfiles /P S:\ /S /M *.xls* /D -01/01/2012 /D -1.12.2012 /C "cmd /c del /q @path"  

Das gleiche dann mit den Word-Serienbrief-Dokumenten, wobei ich hier keinen Schimmer habe, wie man speziell nach Worddokumenten sucht, die als Serienbrief erstellt worden sind.

Auch wenn PowerShell ganz toll ist, wäre mir eine Batch-Lösung lieber. Aber wenn es mit PS einfacher ist... freue ich mich natürlich auch über ein Code-Beispiel mit PS face-smile

Grüße von
Yan face-wink
Member: colinardo
colinardo Jan 31, 2022 updated at 11:09:50 (UTC)
Goto Top
Moin.
Zitat von @Yan2021:
Ob sich das dann auch speziell auf das VERÄNDERUNGS-Datum bezieht, ist mir noch unklar.
Wenn du mal forfiles /? in die Konsole eingegeben hättest, wäre es eigentlich klar gewesen

screenshot

Auch wenn PowerShell ganz toll ist, wäre mir eine Batch-Lösung lieber. Aber wenn es mit PS einfacher ist... freue ich mich natürlich auch über ein Code-Beispiel mit PS face-smile

(Kommentare lesen!)
Add-Type -A System.IO.Compression
Add-Type -A System.IO.Compression.FileSystem

# Ordner mit Dateien
$folder = 'D:\Mein\Pfad'  
# Datum
$date = '2021-01-01'  

# alle *.xls? Dateien mit Änderungsdatum älter als $date löschen (zum scharf schalten das -whatif am Ende der Zeile entfernen)
Get-ChildItem $folder -File -Filter *.xls? -Recurse | ?{$_.LastWriteTime -lt (get-date $date)} | remove-item -Force -whatif

# Nur Word-Dokumente mit Serienbrief-Eigenschaften und Änderungsdatum älter als $date löschen (zum scharf schalten das -whatif ganz am Ende entfernen)
Get-ChildItem $folder -File -Filter *.doc? -Recurse | ?{$_.LastWriteTime -lt (get-date $date)} | ?{
    $zip = [System.IO.Compression.ZipFile]::OpenRead($_.FullName)
    [void][System.IO.Compression.ZipFileExtensions]::ExtractToFile(($zip.Entries | ?{$_.Fullname -eq 'word/settings.xml'}),"$env:Temp\settings.xml")  
    $zip.Dispose()
    ([xml](gc "$env:Temp\settings.xml")).settings.mailmerge  
    rm "$env:Temp\settings.xml" -Force -EA SilentlyContinue  
} | remove-item -Force -WhatIf

Grüße Uwe
Member: Yan2021
Yan2021 Jan 31, 2022 at 11:14:18 (UTC)
Goto Top
Hallo Uwe und danke für die Hilfe...

Ich nehme an, dass Dein Code für die PowerShell ist (sieht jedenfalls nicht nach Batch-Code aus) face-wink

Wenn ich diese Datei an meine Vorgaben angepaßt habe und dann ausführe, würden mir zunächst mal die Excel- bzw. Word-Serienbrief-Dateien nur aufgelistet, die vor dem entsprechenden Datum verändert wurden?
Wenn ja - erhalte ich dann eine Textdatei mit den zu löschenden Dateien?

Und nach Entfernung des Code-Zusatzes "-whatif" würden die Dateien dann gelöscht... richtig?

Grüße,
Yan face-wink
Member: colinardo
colinardo Jan 31, 2022 updated at 11:28:34 (UTC)
Goto Top
Zitat von @Yan2021:
Ich nehme an, dass Dein Code für die PowerShell ist (sieht jedenfalls nicht nach Batch-Code aus) face-wink
Also wenn du das nicht selbst erkennst dann ist wohl endgültig Hopfen und Malz verloren ...
Wenn ich diese Datei an meine Vorgaben angepaßt habe und dann ausführe, würden mir zunächst mal die Excel- bzw. Word-Serienbrief-Dateien nur aufgelistet, die vor dem entsprechenden Datum verändert wurden?
Joa.
Wenn ja - erhalte ich dann eine Textdatei mit den zu löschenden Dateien?
Nein, sie werden so nur in der Konsole angezeigt, kann man aber ganz einfach ändern in dem man das Ergebnis in eine Datei umleitet falls warum auch immer gewünscht.
Und nach Entfernung des Code-Zusatzes "-whatif" würden die Dateien dann gelöscht... richtig?
Rischtisch.
Nachschlagen schadet übrigens nicht:
Optionen "WhatIf", "Confirm" und "ValidateOnly"
Powershell Leitfaden für Anfänger
Member: Yan2021
Yan2021 Jan 31, 2022 at 11:37:02 (UTC)
Goto Top
Zitat von @colinardo:

Zitat von @Yan2021:
Ich nehme an, dass Dein Code für die PowerShell ist (sieht jedenfalls nicht nach Batch-Code aus) face-wink
Also wenn du das nicht selbst erkennst dann ist wohl endgültig Hopfen und Malz verloren ...
Powershell Leitfaden für Anfänger

...deshalb ja der Smilie am Ende meines Satzes face-smile

Das Ganze in eine Textdatei leiten wäre gut, da man sich das Ergebnis dann u.U. auch ausdrucken und prüfen könnte.
Was müßte ich dazu noch ergänzen?

den Leitfaden schaue ich mir mal an.

Grüße von
Yan face-wink
Member: colinardo
colinardo Jan 31, 2022 updated at 11:50:12 (UTC)
Goto Top
Zitat von @Yan2021:
Das Ganze in eine Textdatei leiten wäre gut, da man sich das Ergebnis dann u.U. auch ausdrucken und prüfen könnte.
Was müßte ich dazu noch ergänzen?

Am Anfang des Skripts
Start-Transcript .\log.txt
und am Ende
Stop-Transcript
hinzufügen.

Oder alternativ die Lösch-CMDLets durch Ausgaben ersetzen
Add-Type -A System.IO.Compression
Add-Type -A System.IO.Compression.FileSystem

# Ordner mit Dateien
$folder = 'D:\Mein\Pfad'  
# Datum
$date = '01.01.2021'  

# alle *.xls? Dateien mit Änderungsdatum älter als $date löschen (zum scharf schalten das -whatif am Ende der Zeile entfernen)
Get-ChildItem $folder -File -Filter *.xls? -Recurse | ?{$_.LastWriteTime -lt (get-date $date)} | select -Expand Fullname | add-content "D:\mylog_excel.txt"  

# Nur Word-Dokumente mit Serienbrief-Eigenschaften und Änderungsdatum älter als $date löschen (zum scharf schalten das -whatif ganz am Ende entfernen)
Get-ChildItem $folder -File -Filter *.doc? -Recurse | ?{$_.LastWriteTime -lt (get-date $date)} | ?{
    $zip = [System.IO.Compression.ZipFile]::OpenRead($_.FullName)
    [void][System.IO.Compression.ZipFileExtensions]::ExtractToFile(($zip.Entries | ?{$_.Fullname -eq 'word/settings.xml'}),"$env:Temp\settings.xml")  
    $zip.Dispose()
    ([xml](gc "$env:Temp\settings.xml")).settings.mailmerge  
    rm "$env:Temp\settings.xml" -Force -EA SilentlyContinue  
} | select -Expand Fullname | add-content "D:\mylog_word.txt"  
Member: Yan2021
Yan2021 Jan 31, 2022 at 13:21:07 (UTC)
Goto Top
Hallo Uwe,

danke für die Ergänzung.
Habe jetzt mal eine Testdatei erstellt für alle Dateien vor dem Jahr 2000 (da das nicht viele sein dürften).
Aber nachdem ich sie über die PS gestartet habe, erhalte ich diese Fehlermeldung:

fehler ps

Hab ich was falsch gemacht - oder was muss ich ändern?

Grüße,
Yan face-wink
Member: colinardo
colinardo Jan 31, 2022 updated at 14:20:16 (UTC)
Goto Top
Zitat von @Yan2021:
Hab ich was falsch gemacht - oder was muss ich ändern?
Ja, du hast Punkt 1 der Grundlagen aus meinem Leitfaden zur Executionpolicy nicht gelesen!
https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell. ...

Ey, du hast da zwei Dinger oben neben der Nase, benutze sie ab und zu auch mal 🖖😉.

So long. Ich bin raus aus dem Thread, bevor sich @Frank wieder bei mir meldet🤞.

Viel Erfolg.
Member: Yan2021
Yan2021 Jan 31, 2022 at 14:21:04 (UTC)
Goto Top
Hey.... bitte nicht gleich so sauer reagieren... Am anderen Ende sitzt auch ein Mensch face-wink

Es hat auch nicht funktioniert, als ich die Datei als Admin ausgeführt habe.
Da hat er zwar die Excel-Dateien gefunden, aber bei der Suche nach den Word-Serienbrief-Dokumenten bekam ich MASSEN an Fehlermeldungen.

Grüße von
Yan face-wink
Member: Yan2021
Yan2021 Feb 01, 2022 updated at 09:34:26 (UTC)
Goto Top
Hallo,

schade dass @colinardo ausgestiegen ist.

Das mit den Word-Serienbrief-Dokumenten ist nicht ganz so tragisch.
Ich habe jetzt nach "normalen" Worddateien gesucht und das hat mit dem Code funktioniert.

Soweit - sogut...

Aber ich bräuchte noch einen Hinweis, was ich in dem Code verändern muss, wenn ich bestimmte Verzeichnisse ausschließen möchte.

Hier mal der jetztige Code für die Suche nach Excel-Dateien, deren letztes Änderungsdatum vor dem 1.01.2012 lag:

Add-Type -A System.IO.Compression
Add-Type -A System.IO.Compression.FileSystem

# Ordner mit Dateien
$folder = 'S:\'  
# Datum
$date = '01.01.2012'  

# alle *.xls? Dateien mit Änderungsdatum älter als $date suchen
Get-ChildItem $folder -File -Filter *.xls? -Recurse | ?{$_.LastWriteTime -lt (get-date $date)} | select -Expand Fullname | add-content "S:\mylog_excel.txt"  

Ausgeschlossen werden sollen z.B. die Verzeichnisse "S:\Archiv\DS" und "S:\Archiv\DO" inkl. Unterverzeichnisse!!
Reicht es, wenn ich z.B. den Eintrag "-exclude S:\Archiv\DS\*" hinzufüge oder ggf. "$exlude=@("S:\Archiv\DS", "S:\Archiv\Do")" schon oben einfügen, wo auch das Verzeichnis und Datum angegeben wurde. Oder wie macht man das?

Grüße von
Yan face-wink