imebro 7 Geschrieben 1. Februar 2022 Melden Teilen Geschrieben 1. Februar 2022 (bearbeitet) Hallo, ich habe eine Suchdatei (PS-Script), welches nach Exceldateien sucht, die das letzte Mal vor dem 1.01.2012 geändert worden sind. In diesem Script möchte ich nun zusätzlich verschiedene Verzeichnisse & Unterverzeichnisse ausschließen. 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" Hier wird das Ergebnis in eine Text-Datei ausgegeben. 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 Verzeichnis und Datum angegeben wurden? Vielleicht so: Add-Type -A System.IO.Compression Add-Type -A System.IO.Compression.FileSystem # Ordner mit Dateien $folder = 'S:\Archiv' # Verzeichnisse ausschließen $exclude=@("S:\Archiv\DS", "S:\ARCHIV\DO") # Datum $date = '01.01.2012' # alle *.xls? Dateien mit Änderungsdatum älter als $date suchen Get-ChildItem $folder -File -Filter *.xls? -Recurse -Exclude $exclude | ?{$_.LastWriteTime -lt (get-date $date)} | select -Expand Fullname | add-content "S:\mylog_excel.txt" Bin mir nicht sicher, ober der "Exclude" Eintrag das Richtige bewirkt. Vor allem sollen ja auch die Unterverzeichnisse ausgeschlossen werden. Hat Jemand von Euch eine Idee, wie man das am besten umsetzt? Grüße von imebro bearbeitet 1. Februar 2022 von imebro Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 1. Februar 2022 Melden Teilen Geschrieben 1. Februar 2022 Hi, hol dir doch erst die Ordner, schließe deine Ausnahmen aus und geh dann die Ordner durch. In Quick'n'Dirty: $Exclude = "$Exclude = "S:\\Archiv\\DS|S:\\Archiv\\DO"" $AllFolders = Get-ChildItem -Path "S:\" ` -Recurse ` -Directory $Folders = $AllFolders | where { $_.FullName -notmatch $Exclude } foreach($f in $Folders){ Get-ChildItem -Path $f.FullName -Filter "*.xls?" | ForEach-Object { Add-Content -Path "S:\mylog_excel.txt" ` -Value $_.FullName } } Gruß Jan Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 1. Februar 2022 Melden Teilen Geschrieben 1. Februar 2022 Alternativ: Get-ChildItem $folder -File -Filter *.xls? -Recurse | ?{ ($_.LastWriteTime -lt (get-date $date)) -and (($_.Fullname -notmatch 'S:\Archiv\DO') -or ($_.FullName -notmatch 'S:\Archiv\DS'))} Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 1. Februar 2022 Autor Melden Teilen Geschrieben 1. Februar 2022 (bearbeitet) Hallo und danke Euch Beiden für die guten Tipps. Den Code von @testperson kann ich nicht so ganz verstehen. Da fehlt mir einfach die Erfahrung. Auch frage ich mich, warum im oberen Teil doppelte Backslashes stehen. Muss das so sein? $Exclude = "$Exclude = "S:\\Archiv\\DS|S:\\Archiv\\DO"" Und in der gleichen Zeile (Exclude) wird die Angabe "$Exclude" auch 2 x gemacht. Wieso? Ich habe aus Euren beiden Code-Vorschlägen jetzt mal eine eigene Datei gebastelt. Hier habe ich oben unter "Verzeichnisse ausschließen" den Code-Teil von @testperson eingefügt (allerdings je mit einem Backslash) und in der eigentlichen Codezeile dann noch das "-notmatch $exclude"... eben mit dem Bezug zur obigen Zeile, wo "$exclude" steht. Hier mein Code: Add-Type -A System.IO.Compression Add-Type -A System.IO.Compression.FileSystem # Ordner mit Dateien $folder = 'S:\Archiv' # Verzeichnisse ausschließen $exclude = "S:\Archiv\DS" | "S:\ARCHIV\DO"" # 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)) -and (($_.Fullname -notmatch $exclude))} | select -Expand Fullname | add-content "S:\mylog_excel.txt" Wäre das korrekt so? Danke und Grüße, imebro bearbeitet 1. Februar 2022 von imebro Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 1. Februar 2022 Melden Teilen Geschrieben 1. Februar 2022 Das doppelte $Exclude ist ein Copy&Paste Fehler, glaube ich. Ich nutze die Variable $Exclude als RegEx Pattern und da muss der Backslash maskiert werden. Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 1. Februar 2022 Autor Melden Teilen Geschrieben 1. Februar 2022 OK und danke für die Info. Habe meinen Code jetzt angepaßt. Wäre der denn so zu gebrauchen? Und... in meinem ursprünglichen Code waren ja oben nur einfache Anführungszeichen gesetzt --> ' Ist es egal, ob man diese setzt oder die herkömmlichen --> " Grüße, imebro Zitieren Link zu diesem Kommentar
cj_berlin 1.329 Geschrieben 1. Februar 2022 Melden Teilen Geschrieben 1. Februar 2022 vor 16 Minuten schrieb imebro: Und... in meinem ursprünglichen Code waren ja oben nur einfache Anführungszeichen gesetzt --> ' Ist es egal, ob man diese setzt oder die herkömmlichen --> " Ja, solange Du nur statischen Text drin hast, der keine Anführungszeichen beinhaltet. Andernfalls nein: $a = 'Hello World!' '$a' "$a" "'$a'" Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 2. Februar 2022 Autor Melden Teilen Geschrieben 2. Februar 2022 Hallo nochmal, ist denn der Code, den ich als letztes hochgeladen habe, so in Ordnung? Oder was würdet Ihr ggf. anpassen? Grüße, imebro Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 2. Februar 2022 Melden Teilen Geschrieben 2. Februar 2022 vor 14 Minuten schrieb imebro: ist denn der Code, den ich als letztes hochgeladen habe, so in Ordnung? Tut er denn, was Du möchtest? vor 15 Minuten schrieb imebro: Oder was würdet Ihr ggf. anpassen? Ich würde mindestens nach den Pipe-Symbolen Zeilenumbrüche einfügen und die Aliasse durch die kompletten cmdlets ersetzen. Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 2. Februar 2022 Autor Melden Teilen Geschrieben 2. Februar 2022 Hallo, @BOfH_666: Was genau Du mit den Zeilenumbrüchen sowie mit den Aliassen meinst, ist mir nicht klar. Ich bin tatsächlich Laie in diesem Bereich Habe eben folgenden Code versucht - aber leider tut sich da nichts: Add-Type -A System.IO.Compression Add-Type -A System.IO.Compression.FileSystem # Ordner mit Dateien $folder = 'S:\Archiv\ÖA\2000' # Verzeichnisse ausschließen $exclude = 'S:\ARCHIV\ÖA\2000\Art Berlin', 'S:\ARCHIV\ÖA\2000\Art Event' # 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)) -and (($_.Fullname -notmatch $exclude))} | select -Expand Fullname | add-content 'S:\mylog_excel.txt' Dabei habe ich zunächst mit den normalen Anführungsstrichen gearbeitet ("" "") und dann mit den einfachen (' '). Ergebnis ist gleich. In der Fehlermeldung wurde auch offenbar das "Ö" angemeckert. Aber das steht beim Pfad doch in Anführungsstrichen... Vielleicht könnt Ihr nochmal weiterhelfen. Grüße, imebro Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 2. Februar 2022 Melden Teilen Geschrieben 2. Februar 2022 vor 12 Minuten schrieb imebro: Was genau Du mit den Zeilenumbrüchen sowie mit den Aliassen meinst, ist mir nicht klar. Wenn Du vor hast, noch eine Weile in der IT und dabei in Windows Infrastruktur-Umgebungen unterwegs zu sein, solltest Du dringend anfangen, Dich damit zu befassen. Es wird sich mit an Sicherheit grenzender Wahrscheinlichkeit für Dich lohnen. Hier mal was zum "Nach-Schmökern" https://github.com/PoshCode/PowerShellPracticeAndStyle#the-powershell-best-practices-and-style-guide Im Prinzip sollte das hier alles sein, was Du brauchst: $folder = 'S:\Archiv\ÖA\2000' $exclude = 'Art Berlin|Art Event' $date = Get-Date '01.01.2012' Get-ChildItem -Path $folder -Filter '*.xls?' -File -Recurse | Where-Object { ($_.LastWriteTime -lt $date) -and (($_.Fullname -notmatch $exclude)) } | Select-Object -ExpandProperty Fullname | Add-Content -Path 'S:\mylog_excel.txt' Wie Du sehen kannst, ist der Code so deutlich kompakter, ohne überlange Zeilen, ohne Symbole und Abkürzungen und hoffentlich auch für Laien leichter zu lesen. Zitieren Link zu diesem Kommentar
cj_berlin 1.329 Geschrieben 2. Februar 2022 Melden Teilen Geschrieben 2. Februar 2022 Moin, das ist vielleicht Kosmetik, aber bei vielen zu filternden Dateien dürfte $date = Get-Date '01.01.2012' ... Get-ChildItem $folder -File -Filter *.xls? -Recurse | Where-Object { ($_.LastWriteTime -lt $date) ... } etwas performanter sein als $date = '01.01.2012' ... Get-ChildItem $folder -File -Filter *.xls? -Recurse | ?{ ($_.LastWriteTime -lt (get-date $date)) ...} Die Änderung von ? in Where-Object hat keinen Performance-Gewinn, aber wir versuchen, keine Shorthand und keine Aliase in Skripten zu verwenden, auch wenn sie auf der Kommandozeile ein Paar Tastendrücke sparen. 1 Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 2. Februar 2022 Autor Melden Teilen Geschrieben 2. Februar 2022 Danke für die weitere Hilfe. Ich habe im Grunde nicht wirklich vor, mich mehr mit IT zu befassen. Ich wurde hier "ins kalte Wasser" geworfen, da unser IT-ler nicht mehr hier arbeitet... und sonst kann´s halt keiner Werde den Code mal ausprobieren und dann auch die Anpassungen von @cj_berlin mit reinnehmen. Grüße, imebro Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 3. Februar 2022 Autor Melden Teilen Geschrieben 3. Februar 2022 (bearbeitet) Hallo, ich habe den Code eben ausprobiert. Hier mal zunächst mein Code: Add-Type -A System.IO.Compression Add-Type -A System.IO.Compression.FileSystem # Verzeichnis $folder = 'S:\' # Verzeichnisse ausschließen $exclude = 'Archiv\Datenschutz|Archiv\Puetz\Nachlässe|ADMIN\S E C U R I T Y' # Datum $date = Get-Date '01.01.2012' # Nur Excel-Dokumente mit Änderungsdatum älter als $date suchen Get-ChildItem -Path $folder -Filter '*.xls?' -File -Recurse | Where-Object { ($_.LastWriteTime -lt $date) -and (($_.Fullname -notmatch $exclude)) } | Select-Object -ExpandProperty Fullname | Add-Content -Path 'S:\mylog_excel.txt' # Nur Word-Dokumente mit Änderungsdatum älter als $date suchen Get-ChildItem -Path $folder -Filter '*.doc?' -File -Recurse | Where-Object { ($_.LastWriteTime -lt $date) -and (($_.Fullname -notmatch $exclude)) } | Select-Object -ExpandProperty Fullname | Add-Content -Path 'S:\mylog_word.txt' Leider erhielt ich die folgende Fehlermeldung: "Archiv\Datenschutz|Archiv\Puetz\Nachlässe|ADMIN\S E C U R I T Y" wird analysiert - Falsch formatiertes \p{X}-Escape-Zeichen. In C:\Users\Name\Desktop\TESTLAUF.ps1:13 Zeichen:20 + ... re-Object { ($_.LastWriteTime -lt $date) -and (($_.Fullname -notmatch ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], ArgumentException + FullyQualifiedErrorId : System.ArgumentException Die gleiche Fehlermeldung gibt es auch nochmal mit der Angabe ".ps1:19 Zeichen:20" in der zweiten Zeile. ** ich habe die GetChildItem-Zeile auch nochmal korrigiert in: Get-ChildItem $folder -File -Filter '*.xls?' -Recurse | Aber das Ergebnis ist gleich. Es erscheint die gleiche Fehlermeldung (siehe oben). Kann mir da bitte nochmal jemand helfen? Danke und Grüße, imebro bearbeitet 3. Februar 2022 von imebro Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 3. Februar 2022 Melden Teilen Geschrieben 3. Februar 2022 (bearbeitet) vor 24 Minuten schrieb imebro: $exclude = 'Archiv\Datenschutz|Archiv\Puetz\Nachlässe|ADMIN\S E C U R I T Y' Der Variable $Exclude wird hier ein Regex-Pattern übergeben. Das Zeichen "\" (der Backslash) hat dabei eine besondere Bedeutung. Entweder Du findest ein Muster, wo Du den Backslash weglassen kannst oder Du must ihn "Escapen" ... also "\\" anstatt "\". bearbeitet 3. Februar 2022 von BOfH_666 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.