Jump to content

Mehrere Verzeichnisse und Unterverzeichnisse von der Suche ausschließen (PS)


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 :wtf:

 

Grüße,

imebro

bearbeitet von imebro
Link zu diesem Kommentar

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:

 

Testlauf1.jpg.6b3dcc60f26679c4d24565b68b492ec3.jpg

 

Was müßte ich am Code ändern?

 

Grüße,

imebro

bearbeitet von imebro
Link zu diesem Kommentar

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

Link zu diesem Kommentar
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. 

Link zu diesem Kommentar

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 von imebro
Link zu diesem Kommentar
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.

Link zu diesem Kommentar

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 von imebro
Link zu diesem Kommentar
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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar
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.

Link zu diesem Kommentar

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 :thumb1:

 

Grüße,

imebro

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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 von imebro
Link zu diesem Kommentar
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 von BOfH_666
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...