imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 (bearbeitet) Hallo Jan, vielen Dank für die Hilfe. So verstehe ich es schon recht gut... Die erste Möglichkeit ist mir "sympathischer" da ich sie besser verstehe. Ich nehme an, dass das Ergebnis gleich sein wird. Die "Include"-Codezeile habe ich jetzt so abgeändert: $include = '*.doc?', '*.bak?', '*.xls?' Ich möchte auch nach allen Excel-Dateien suchen (also xls, xlsx, xlsm...). Denke das ist OK so. Werde dann jetzt (vorsichtshalber) doch mal ein Verzeichnis auf dem Laufwerk "S" anlegen, dort ein paar .doc und ein paar .bak Dateien rein kopieren, dann den Code entsprechend der Verzeichnisse anpassen und dann testen. Bin sehr gespannt Grüße, imebro bearbeitet 7. Februar 2022 von imebro Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 (bearbeitet) Hallo nochmal, habe jetzt einen Testlauf mit einem Testverzeichnis gemacht. Zunächst mal mit aktiviertem "-whatif". In dem Verzeichnis u. den Unterverzeichnissen liegen Word- u. Exceldateien sowie ein paar PDF-Dateien, die erhalten bleiben sollen. Ausgeschlossen werden sollte das Unterverzeichnis "U1\UU1". Aber wie Ihr im Ergebnis sehr, funktioniert der Code offenbar nur bei den ".docx" Dateien. Hier mal ein Screenshot des Ergebnisses: Was müßte ich am Code ändern? Grüße, imebro bearbeitet 7. Februar 2022 von imebro 1 Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 Hallo, ich würde jetzt jeden Befehl, angefangen mit "Get-ChildItem", einzeln ausführen und die Ausgaben überprüfen. Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 Hallo und danke für Deine Antwort. Wie genau meinst Du das mit "jeden Befehl einzeln ausführen..."? Ich habe eben nochmal die zweite Codezeile wie folgt geändert: $include = '*.doc?, *.dot?, *.wbk?, *.bak?, *.xls?' Vorher waren ja hinter und vor jedem einzelnen Eintrag noch diese Anführungsstriche ('). Dann tut sich aber überhaupt nichts, nachdem ich den Code ausgeführt habe. Grüße, imebro 1 Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 vor 4 Minuten schrieb imebro: Vorher waren ja hinter und vor jedem einzelnen Eintrag noch diese Anführungsstriche ('). Dann tut sich aber überhaupt nichts, nachdem ich den Code ausgeführt habe. Blind einfach Code ändern und "hoffen" ist der falsche Ansatz. Lese "-Include" beim Hersteller in der Dokumentation nach Get-ChildItem (Microsoft.PowerShell.Management) - PowerShell | Microsoft Docs. Als Eingabe wird ein "String Array"-Object String[] benötigt. vor 8 Minuten schrieb imebro: Wie genau meinst Du das mit "jeden Befehl einzeln ausführen..."? Eigentlich genau das was ich geschrieben hab. Befehle werden durch eine Pipe | getrennt. Also jeden Befehl (Kommando mit seinen Argumenten) einzeln unten in der Powershell ausführen und sich das Ergebnis anschauen und vergleichen. 1 Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 (bearbeitet) Hallo und danke... OK, ich habe es versucht. Zunächst mal nur die Zeile mit "GetChildItem". Dabei erhalte ich folgende Meldung: $folder = 'S:\Test\*' $include = '*.doc?, *.dot?, *.wbk?, *.bak?, *.xls?' $exclude = 'U1\\UU1' $date = Get-Date '01.01.2021' # Nur Word-/Excel Dokumente mit Änderungsdatum älter als $date suchen Get-ChildItem $folder -File -Include $include -Recurse | ---------------------------------------------------------- Get-ChildItem $folder -File -Include $include -Recurse bei der zweiten Zeile: Where-Object { ($_.LastWriteTime -lt $date) -and (($_.Fullname -notmatch $exclude)) } bei der dritten Zeile: Remove-Item -Force -whatif Cmdlet Remove-Item an der Befehlspipelineposition 1 Geben Sie Werte für die folgenden Parameter an: Path[0]: Da wird dann nur darauf hingewiesen, dass der Pfad fehlt. Aber... Mir sagt das jetzt nicht wirklich etwas darüber aus, warum der Code ansich komplett nur .docx Dateien gelöscht hätte. Grüße, imebro bearbeitet 7. Februar 2022 von imebro 1 Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 vor 20 Minuten schrieb imebro: Mir sagt das jetzt nicht wirklich etwas darüber aus, warum der Code ansich komplett nur .docx Dateien gelöscht hätte. Uns auch nicht, denn das sind die Grenzen eines Forums. Das musst du jetzt Stück für Stück herausfinden. Wichtig ist, das du mit dem ersten Befehl beginnst. Damit dieser alleine funktioniert, musst du noch die Argumente der Variablen ($exclude) in das Argument des Befehls (-Exclude) übertragen. Schaue Dir die Ausgabe an und überlege, ob dort alle Informationen drin stehen die du brauchst und die der zweite Befehl weiter verarbeiten kann. Falls ja, hänge den zweiten Befehl mit dran. Falls nein, dann musst du an dem ersten Befehl noch arbeiten. Essentiell ist das Verständnis der einzelnen Befehle um auch die Kombination zu verstehen. Handlungsschritt 1: Validiere das im ersten Befehl alle nötigen Informationen drin stehen, die auch verarbeitet werden sollen. Handlungsschritt 2: Hänge den zweiten Befehl mit dran. Validiere das alle nötigen Informationen drin stehen, die auch verarbeitet werden sollen. Handlungsschritt 3: Hänge den dritten Befehl mit dran. Validiere das alle nötigen Informationen drin stehen, die auch verarbeitet werden sollen. 2 Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 (bearbeitet) OK... 1) Ich habe jetzt einen erfolgreichen Test gemacht mit dem Code (siehe erste Zeile) und dem Ergebnis nach "ausführen": $folder = '\\dasfile2\daten\Test\*' $include = '*.doc?', '*.dot?', '*.wbk?', '*.bak?', '*.xls?' $exclude = 'U1\\UU1' $date = Get-Date '01.01.2021' # Nur Word-/Excel Dokumente mit Änderungsdatum älter als $date suchen Get-ChildItem $folder -File -Include $include -Exclude $exclude -Recurse --------------------------------------- Ergbnis: Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 25.11.2021 11:31 21470 Abl_2.dotx -a---- 21.01.2022 10:04 33625 Budget 2021_A bearbeitete 202103.xlsx -a---- 25.11.2021 11:29 19128 Ein_Bst.dotx -a---- 10.01.2022 16:12 206481 JB 2020_Ant_Mastercopy_20210505.xlsx -a---- 07.12.2021 13:55 734122 JB 2020_Ant_Mastercopy_20210413.xlsx -a---- 29.12.2021 13:47 27496 P-Mittelabruf_Projekt_20211202.xlsx -a---- 06.12.2021 13:20 18487 P-Mittelabruf_Projek_20211206_final.xlsx -a---- 13.01.2022 15:38 13043 Rundmail_Verteiler.xlsx -a---- 24.01.2022 16:03 8583 Rück für 2022.xlsx -a---- 15.12.2021 11:03 27482 W_hilfe_Rund 2020_201001.xlsx Hier werden im Ergebnis nur die Dateien aufgeführt, die NICHT älter sind, als 1.1.21. Und... wie man sieht, habe ich die folder-Angabe geändert von S:\* zu \\dasfile2\daten\Test\* Vielleicht hat auch das etwas bewirkt, den UNC-Pfad anzugeben. 2) Hänge ich die zweite Codezeile nun im 2. Schritt mit an, bleibt das Ergebnis genau gleich, wie oben auch!! 3) Hänge ich jetzt die 3. Codezeile im 3. Schritt an, erscheint nochmal das gleiche Ergebnis, jedoch mit dem Zusatz: Cmdlet Remove-Item an der Befehlspipelineposition 1 Geben Sie Werte für die folgenden Parameter an: Path[0]: Wichtig wäre noch zu erwähnen, dass ich die senkrechten Striche (Pipes??) weggelassen habe. Setze ich diese ein, passiert überhaupt nichts!! Übrigens passiert genau das Gleiche, wenn ich den Zusatz "-Exclude $exclude" aus der GetChild-Item Zeile wieder entferne. Hier der gesamte Code für Schritt 3: $folder = '\\dasfile2\daten\Test\*' $include = '*.doc?', '*.dot?', '*.wbk?', '*.bak?', '*.xls?' $exclude = 'U1\\UU1' $date = Get-Date '01.01.2021' # Nur Word-/Excel Dokumente mit Änderungsdatum älter als $date suchen Get-ChildItem $folder -File -Include $include -Exclude $exclude -Recurse Where-Object { ($_.LastWriteTime -lt $date) -and (($_.Fullname -notmatch $exclude)) } Remove-Item -Force -WhatIf Grüße, imebro bearbeitet 7. Februar 2022 von imebro Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 vor 6 Minuten schrieb imebro: Hier werden im Ergebnis nur die Dateien aufgeführt, die NICHT älter sind, als 1.1.21. Siehst du da einen Zusammenhang mit dem Befehl Get-ChildItem? Hat das was mit $date = Get-Date '01.01.2021' zu tun? vor 7 Minuten schrieb imebro: Und... wie man sieht, habe ich die folder-Angabe geändert von S:\* zu \\dasfile2\daten\Test\* Vielleicht hat auch das etwas bewirkt, den UNC-Pfad anzugeben. Ok. Macht das einen Unterschied für Dich? Was meinst du denn, was der UNC bewirkt hat? Das tolle ist, wir sind nun an dem Punkt angelangt, an dem du selber bisschen probieren und testen kannst. Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 Danke Dir... Keine Ahnung, ob das mit dem Get-Date zu tun hat. Ich fand nur merkwürdig, dass nur die Dateien aufgeführt wurden, die am Ende NICHT gelöscht wurden. Habe übrigens bei einem weiteren Versuch aus der 2. Zeile das "-Exclude $exclude" wieder entfernt. Aber auch da erhalte ich genau das gleiche Ergebnis mit diesem Zusatz Cmdlet Remove-Item an der Befehlspipelineposition 1 Geben Sie Werte für die folgenden Parameter an: Path[0]: Irgendwie kapiere ich das hier überhaupt nicht. Aber ich bin ja tatsächlich auch ein absoluter Laie, was PS angeht. Bisher habe ich immer eher was mit Batchdateien gemacht. Fand das viel einfacher und verständlicher Aber da habe ich keine Möglichkeit, Dateien "älter als" zu filtern... jedenfalls nicht so, dass ich sie am Ende auch löschen könnte. Grüße, imebro Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 vor 1 Minute schrieb imebro: Irgendwie kapiere ich das hier überhaupt nicht. Aber ich bin ja tatsächlich auch ein absoluter Laie, was PS angeht. Es auch schwierig gleich mit einer Befehlsfolge anzufangen. Setze dich erstmal mit den einzelnen Befehlen und deren Argumenten auseinander. Danach, wenn du das alles mal verstanden hast, kannst du anfangen diese zu verknüpfen. Sonst kommst du hier auf keinen grünen Zweig. Jeder fängt mal klein an, daher sollten die Probleme/Herausforderungen auch klein sein. Wie es sich ließt, ist das hier eine Aufgabe zu groß. Lass dich nicht entmutigen und experimentiere ein bisschen mit den einzelnen Befehlen und deren Objekten zur Ein- und Ausgabe. Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 Hallo und danke nochmal... Natürlich hast Du Recht, aber das hier hatten wir ja schon mal am Anfang (oder Mitte) dieses Threads. Ich habe diese Frage hier wegen einem akuten Problem gestellt. Um jetzt zuerst mal PS zu lernen, habe ich nicht die Zeit... ich muss ja das Problem irgendwie lösen. Daher hatte ich einfach gehofft, dass mir hier jemand einfach mit einem Code weiterhelfen könnte, mit dem ich das hinbekomme. Mir ist egal, ob es PowerShell, Batch oder Robocopy etc. ist... Ich bin kein IT-ler, sondern mache das hier "so gut es irgendwie geht". Hatte ich alles schon vor mehreren Seiten erklärt Falls Du mir also mit einem Code weiterhelfen magst.......... sehr gerne Grüße, imebro 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 Auch auf die Gefahr hin, missverstanden zu werden oder als belehrend oder beleidigend oder nicht hilfsbereit dazustehen - hier nochmal abschließend meine 2 Cent: Auch wenn Du Dir die Aufgabe nicht ausgesucht hast und Du keine formale Ausbildung dafür erhalten hast, bist Du im Moment in Deiner Organisation der IT-Profi. Wenn Dein Chef sagt, dass Du Dich um die IT kümmern musst, dann bist Du ein IT-ler - ob Dir das gefällt oder nicht. Und als solcher erwartet man von Dir hier in diesem Forum ein gewisses Maß an Mitarbeit und Grundlagenkenntnissen. Und wenn ich Dich nicht falsch verstanden hatte, sieht es wohl danach aus, als müsstest Du diese Aufgabe noch ein wenig länger bewältigen. Da würden Dir dann ein paar Grundlagen und ganz speziell PowerShell-Kenntnisse, ne Menge Frust und sinnlos verschwendete Zeit ersparen. PowerShell ist ein sehr mächtiges Werkzeug, welches, wenn man es beherrscht, die mitunter lästige IT-Administration sehr erleichtert. Ohne diese Grundlagen wirst Du viele der Hilfen, die Du hier und auch wo anders im Netz bekommen kannst, einfach nicht verstehen. Und man kann eine komplexe Technologie wie eine moderne objekt-orientierte Script-Sprache nicht dadurch erlernen, ein paar Code-Schnipsel, die man im Internet gefunden hat, beliebig zusammenzustöpseln. Und es ist auch nicht möglich so etwas im Rahmen eines Forums zu erlernen. Last, but not least werden Dir in einem Forum keine gebrauchsfertigen Lösungen auf Anfrage erstellt. Die meisten von uns verdienen mit solchen oder ähnlichen Arbeiten ihr Geld. Wie würde es Dir gefallen, wenn das, wofür Du Dein Geld bekommst, jemand anders kostenlos abgibt und Dich damit arbeitslos macht? Ich hoffe, dass Du das verstehen kannst und Dir die Zeit nimmst, die Du brauchst, um Dir das Basis-Wissen für Deinen momentanen Job anzueignen. Im Zweifel solltest Du Deinen Chef darauf ansprechen, mindestens ein wenig Zeit eingeräumt zu bekommen, die Dir übertragenen Aufgaben vernünftig erledigen zu können. Und dazu gehört dann im Zweifel eben auch ein wenig Selbststudium. Zitieren Link zu diesem Kommentar
imebro 7 Geschrieben 7. Februar 2022 Autor Melden Teilen Geschrieben 7. Februar 2022 (bearbeitet) OK... Habe es jetzt mal mit Robocopy versucht, womit ich mich etwas besser auskenne, indem ich zunächst die gefundenen Dateien in ein anderes Verzeichnis verschiebe und dieses im Anschluss lösche (mit einer weiteren Batch). Hier mal der Code, der die Dateien verschieben soll: mkdir S:\Test3 robocopy.exe S:\Test\*.xls* S:\Test3 /E /MOVE /maxlad:20210101 /R:1 /W:1 /LOG+:S\Test3\LOG.txt robocopy.exe S:\Test\*.doc* S:\Test3 /E /MOVE /maxlad:20210101 /R:1 /W:1 /LOG+:S\Test3\LOG.txt robocopy.exe S:\Test\*.wbk* S:\Test3 /E /MOVE /maxlad:20210101 /R:1 /W:1 /LOG+:S\Test3\LOG.txt robocopy.exe S:\Test\*.bak* S:\Test3 /E /MOVE /maxlad:20210101 /R:1 /W:1 /LOG+:S\Test3\LOG.txt robocopy.exe S:\Test\*.dot* S:\Test3 /E /MOVE /maxlad:20210101 /R:1 /W:1 /LOG+:S\Test3\LOG.txt Leider tut sich auch hier nichts. Eigentlich meint "/maxlad:20210101" doch alle Dateien, auf die am letzten Mal am 1.01.2021 zugegriffen wurde... oder nicht? So habe ich es jedenfalls recherchiert. Wenn ich diese Batch ausführe, passiert nichts. Grüße, imebro bearbeitet 7. Februar 2022 von imebro Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 7. Februar 2022 Melden Teilen Geschrieben 7. Februar 2022 (bearbeitet) vor 1 Stunde schrieb imebro: Wenn ich diese Batch ausführe, passiert nichts. Warum muss es denn immer gleich ein Skript sein? Starte doch einfach eine CMD oder eine PowerShell und gib erstmal einen einzelnen Befehl ein. Wenn der funktioniert, den nächsten und so weiter. vor 1 Stunde schrieb imebro: mal mit Robocopy versucht, womit ich mich etwas besser auskenne, ... das ist doch gar nicht nötig. Die robocopy Hilfe, die Du einfach mit robocopy /? aufrufen kannst, erklärt doch alles haarklein. Die ersten Zeilen erklären die generelle Syntax: Zitat Syntax :: ROBOCOPY Quelle Ziel [Datei [Datei]...] [Optionen] Quelle :: Quellverzeichnis (Laufwerk:\Pfad oder \\Server\Freigabe\Pfad) Ziel :: Zielverzeichnis (Laufwerk:\Pfad oder \\Server\Freigabe\Pfad) Datei :: Zu kopierende Dateien (Namen/Platzhalter: Standard ist "*.*") also 1. robocopy 2. Quell-Verzeichnis 3. Ziel-Verzeichnis 4. Datei, Datei, Datei bearbeitet 7. 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.