PS: gci zeigt Unterverzeichnisse nicht an

ral9004

Lieutenant
Registriert
Dez. 2017
Beiträge
569
Hallo

Mit diesem Befehl werden mir die Unterverzeichnisse eines Verzeichnisses angezeigt:
PowerShell:
PS C:\> gci -Path "SerieDead\Altered Carbon - Das Unsterblichkeitsprogramm (2018)" -Recurse -Depth 2 -Directory | sort | select Name

Wenn ich eine Verzeichnisebene höher ansetze und von allen Verzeichnissen die Unterverzeichnisse sehen will, klappt das nicht.
PowerShell:
PS C:\> gci -Path "SerieDead" -Recurse -Depth 2 -Directory | sort | select Name

powershell.png


Auch wenn ich für den Parameter "-Depth" einen höheren Wert wie 3 oder 4 angebe. Was übersehe ich hier?


Grüsse an die Foristen
 
Also ich kenne mich jetzt auf der PS nicht so gut aus, aber wenn ich das richtig sehe machen in deinem Screenshot beide Befehle das gleiche. Sie zeigen beide die Ordner auf, die im jeweiligen Verzeichnis enthalten sind. (Ich gehe einfach davon aus, dass der Ordner SerieDead die ganzen Serien enthält und der Ordner Altered... nur die Ordner Season 1 und Season 2). Unterordner der Unterverzeichnisse kann ich auf dem Screenshot nicht erkennen.

Vielleicht mal mit -Force oder am Ende des Pfades mit nach dem \ noch ein *? Wäre zumindest mein Ansatz
 
Hallo DorMoordor

Das "Problem" hat sich erledigt.

Grüsse
 
Was war denn das Problem? Vielleicht hat irgendjemand nochmal das Problem, da wäre es doch super, wenn er hier die Lösung finden würde
 
  • Gefällt mir
Reaktionen: DerFahnder
Hallo aronlad

Danke für diesen schlecht gelaunten, despektierlichen und nicht informativen Beitrag.

Für die etwas besser erzogenen und lernfreudigen Forumsteilnehmer:
Es ist ein Darstellungsproblem. Analog "dir /b" werden die Verzeichnisse in einen Flat Struktur dargestellt.
D.h. er liest alle Verzeichnisse ein, generiert eine Liste und gibt diese aus.
Die Struktur wird ignoriert.

Lösung:
IMO: Jedes Verzeichnis separat auslesen (For Konstrukt).
Wenn ich Zeit finde, werde ich das auspuzzeln und posten

Grüsse
 
Es gehört halt auch zum guten Stil in Internet Foren der Allgemeinheit, die mitliest, die Antwort auf die selbst gestellte Frage zu liefern.
Einfach nur zu schreiben, dass es sich erledigt hat gehört halt auch nicht zum guten Ton.

Liebe Grüße :-)
 
  • Gefällt mir
Reaktionen: dms und ral9004
ral9004 schrieb:
D.h. er liest alle Verzeichnisse ein, generiert eine Liste und gibt diese aus.
Die Struktur wird ignoriert.
Ja, exakt. Dafür sorgst du mit deinem "sort | select Name". Was soll da auch anderes passieren? Der Parameter -Depth ohne irgendwelche Umleitungen gibt alle Unterverzeichnisse einzeln aus.
 
  • Gefällt mir
Reaktionen: ral9004
Art Vandelay schrieb:
Es gehört halt auch zum guten Stil in Internet Foren der Allgemeinheit, die mitliest, die Antwort auf die selbst gestellte Frage zu liefern.
Einfach nur zu schreiben, dass es sich erledigt hat gehört halt auch nicht zum guten Ton.

Liebe Grüße :-)
Hallo Art
Das kann ich nachvollziehen. Schliesslich ist u.a. das Ziel des Forums Wissen auf breiter Basis zu teilen.
Die Lösung habe ich vorhin getestet und folgt unten.

Ich denke, dass es nicht nur mir so geht, dass etwas erledigen will und die liebe Software nicht spielt. Und da täglich 1001 Anforderung auf uns niederprasselt, muss man laufend Dinge loslassen / parkieren. AKA als "erledigt" betrachten, weil man einfach ehrlicherweise gestehen muss, dass man bereits zu viel auf der Halde (Bücher / Artikel / Filme / Kurse / etc.) hat.

Der zweite Fall, wo sich etwas erledigen kann, wenn der Zeitaufwand in keinem Verhältnis mehr steht. Ich hatte letzthin in einem Linux Forum einen Post abgesetzt. 5 Antworten abgearbeitet - d.h. genau umgesetzt, Feedback geliefert mit Screenshot. Aber die Posts waren in den Details unstimmig bzw. oberflächlich. Da habe ich mich auch nur noch bedankt und den Fall für erledigt erklärt. "Waste of Time"

Konklusion:
Jeder von mir gestartete Post werde ich gerne mit einer "Lösung" abschliessen. Wobei "Lösung" eine maximale Bandbreite beinhaltet

Grüsse
 
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
 

Anhänge

Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Art Vandelay
Tolle Google Zusammenstellung. Die die Lösung zu deinem eigentlichen Problem aber nicht umfasst... Nur rumschwätzen bringt nicht viel.
 
  • Gefällt mir
Reaktionen: ral9004
ral9004 schrieb:
Nur Verzeichnisse berücksichtigen, die mit einer bestimmten Zeichenfolge beginnen:
Der Befehl ist zwar korrekt, das -Recurse kann allerdings weg, denn der Parameter -Depth beinhaltet -Recurse.
 
  • Gefällt mir
Reaktionen: ral9004
aronlad schrieb:
Tolle Google Zusammenstellung. Die die Lösung zu deinem eigentlichen Problem aber nicht umfasst... Nur rumschwätzen bringt nicht viel.
Hallo aronlad

Da stimme ich Dir zu.
Gut Ding will Weile haben...
Bitte diese Site reloaden, damit Du den Update von vorhin siehst.

Grüsse
Ergänzung ()

Evil E-Lex schrieb:
Der Befehl ist zwar korrekt, das -Recurse kann allerdings weg, denn der Parameter -Depth beinhaltet -Recurse.
Hallo Evil E-Lex

Danke für die Informationen.
Habe soeben meine Post abgeschlossen.
Das "Fragment" das bis vorhin da war, ist das Resultat eines Browser Absturzes von gestern Abend.

Grüsse
 
ral9004 schrieb:
Gut Ding will Weile haben...
Viel rumschwätzen ist noch lange nicht etwas sinnvolles zu sagen. Und nix trifft bei dir mehr zu.
Die einfache Lösung ist: sort | select name macht es flat (also speziell sort). Mehr muss man dazu nicht sagen. Der Rest (also dein Post) ist Geschwafel.
 
Hallo aronlad

Mir war nicht klar, dass "sort" alles flach macht.
Daher baute ich ein kleines Skript, dass die hierarchische Struktur abbildete.
Wieder etwas gelernt.

Danke für Deine fortwährend konstruktive Kritik und gute Laune in diesem Thread...

Grüsse
 
Zurück
Oben