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,

 

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

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

Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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

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

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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