Nachtrag: Use Case und Lösung
Use Case
In einer Verzeichnisstruktur sollen alle Verzeichnisse einer Ebene aufgelistet werden. Zusätzlich alle Unterverzeichnisse die bestimmte Namenskriterien erfüllen.
Die Lösung soll mit dem Powershell Befehl "get-childitem", nachfolgend nur noch in Kurzform als "gci" geschrieben, gelöst werden.
Abschliessend die Liste in eine Text Datei, alternativ CSV Format, schreiben
"Quick and Dirty" Lösungen
Ansatz1:
CMD: dir [Zeichenfolge] /ad /s /b
Ansatz2:
Mit einem Basic Dialekt (WScirpt / VBScripit / VBA) den Verzeichnisbaum in eine Variable schreiben. Danach mit den Textfunktionen wie MID$ etc. diese parsern. Die Informationen heraus suchen und formatieren.
PS - Befehle
Nachfolgend die Annäherung mit den verschiedenen Elementen des Cmdlets. Die Objekte und Parameter werden abgeschrieben. D.h. "-Directory" anstatt "-di" .
Erste Recherche, welche Möglichkeiten "gci" bietet:
Alle Objekte der aktuellen Ebene anzeigen:
PS C:\temp\Cisco Switch> gci
Nur Objekte vom Typ "Verzeichnis" in der aktuellen Ebene anzeigen:
PS C:\temp\Cisco Switch> gci -Directory
Nur Objekte vom Typ "Verzeichnis" in der aktuellen Ebene als auch der Unterebenen anzeigen. Die Tiefe an Unterebenen kann ggf. über "-depth" reguliert werden
PS C:\temp\Cisco Switch> gci -Directory -Recurse:
Nur Verzeichnisse berücksichtigen, die mit einer bestimmten Zeichenfolge beginnen:
PS C:\temp\Cisco Switch> gci -Recurse -Depth 3 -Directory -filter [zeichenfolge]
Daraus entstand dieses Skript:
# ***** Verzeichnisstruktur auf Verzeichnisse prüfen, welche mit der Sequenz "Typ" beginnen *****
# ***** Version 0.9 // 22.04.2023 *****
# ***** Offene Punkte / Ideen: *****
# ***** --> "set-location" durch den Parameter path bei GCI ersetzen *****
# ***** --> "Dateiliste im CSV oder HTML Format speichern *****
# ***** --> Errorhandler ist auf Grund der Kürze des Snippets übertrieben *****
# Prolog
$log = "c:\temp\dir_typ_log.txt"
get-date | Add-content $log
<# Dieser Code geht von einer 3 stufigen Verzeichnisstruktur aus:
Ebene1
Ebene2
Ebene 3
Ebene1 ist statisch. D.h. hier werden keine neuen Werte erwartet.
Daher ist diese Ebene (Catalyst / Meraki / Nexux) hardcodiert. Nicht dynamisch eingelesen.
Dieser Codeblock sollte korrekterweise in einem Modul (Funktion) gespeichert sein
Dieser wiederholt sich unten 2x. Besser wäre der Aufruf über ein Modul mit den Variablen "Ebene2 Name" und "Verzeichnis".
Tempus fugit... #>
set-location "C:\temp\Cisco Switch\Catalyst"
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" | Add-content $log
"Serie Catalyst" | Add-content $log
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" | Add-content $log
#Ebene 2 von Catalyst einlesen
foreach ($fileObj in gci -Directory -Name) {
$fileStr = split-path -leaf $fileObj
"Model and types" | Add-content $log
$fileStr | Add-content $log
# prüfen ob es auf der Ebene 3 Unterverzeichnisse hat, welche mit dem Pattern "typ" beginnen.
# Wenn nein, in das Logfile einen Vermerkt darüber machen..
$check = gci $fileStr -Directory -recurse -name 'typ*'
if (!$check) {"This model has no types" | Add-content $log}
# Die vorhandenen "Typ..." Verzeichnisse in das Logfile schreiben
# Ein "Else" zum If oben bzw. eine zweite IF Prüfung ist nicht notwendig
# Wenn es keine entsprechenden Verzeichnisse hat, tritt kein Fehler auf
gci $fileStr -Directory -name 'typ*' | Add-content $log
"//////////////////////////////////////////////" | Add-content $log
}
set-location "C:\temp\Cisco Switch\Meraki"
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" | Add-content $log
"Meraki" | Add-content $log
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" | Add-content $log
foreach ($fileObj in gci -Directory -Name) {
$fileStr = split-path -leaf $fileObj
"Model and types" | Add-content $log
$fileStr | Add-content $log
$check = gci $fileStr -Directory -recurse -name 'typ*'
if (!$check) {"This model has no types" | Add-content $log}
gci $fileStr -Directory -name 'typ*' | Add-content $log
"//////////////////////////////////////////////" | Add-content $log
}
set-location "C:\temp\Cisco Switch\Nexus"
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" | Add-content $log
"Nexus" | Add-content $log
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" | Add-content $log
foreach ($fileObj in gci -Directory -Name) {
$fileStr = split-path -leaf $fileObj
"Model and types" | Add-content $log
$fileStr | Add-content $log
$check = gci $fileStr -Directory -recurse -name 'typ*'
if (!$check) {"This model has no types" | Add-content $log}
gci $fileStr -Directory -name 'typ*' | Add-content $log
"//////////////////////////////////////////////" | Add-content $log
}
# Epilog
set-location "C:\temp\"
get-content $log
Dieses Skript wurde mit dieser Verzeichnisstruktur (siehe "verz-list.txt") erfolgreich getestet
Der Code ist in der Datei "source-code.txt.
Best Practice Vorschläge sind erwünscht. Dieser Code ist nur Sonntagsnachmittag Entwurf unter zu Hilfenahme von starken Expressi sowie britischem Glam-Rock der 70er Jahre... 😎
Grüsse