[PowerShell] Alle Ordner der zweiten Unterebene

KaeTuuN

Rear Admiral Pro
Registriert
Okt. 2002
Beiträge
5.305
Hallo zusammen,

ich habe ein kleines Problem mit PowerShell. Und zwar möchte ich nur die zweite Unterebene einer Verzeichnisstruktur ausgeben.
Zur veranschaulichung:
Code:
C:\1-Ebene-A\2-Ebene
C:\1-Ebene-A\2-Ebene\3-Ebene
C:\1-Ebene-A\2-Ebene\3-Ebene\4-Ebene
C:\1-Ebene-A\2-Ebene\3-Ebene\4-Ebene\5-Ebene
C:\1-Ebene-A\2-Ebene\3-Ebene\4-Ebene\5-Ebene
C:\1-Ebene-B\2-Ebene
C:\1-Ebene-B\2-Ebene\3-Ebene
C:\1-Ebene-B\2-Ebene\3-Ebene\4-Ebene
C:\1-Ebene-B\2-Ebene\3-Ebene\4-Ebene\5-Ebene
C:\1-Ebene-B\2-Ebene\3-Ebene\4-Ebene\5-Ebene
Dann möchte ich dort nur die erste und sechste Zeile ausgegeben haben.
Unterverzeichnisse generell kann ich ja so ausgeben:
Code:
Get-ChildItem c:\ -recurse | ? { $_.PSisContainer -eq $true} | % {write-host $_.fullname}
Aber wie bekomme ich dort nun die Ebenenbeschränkung rein?
Kann ich evtl filtern, dass der Backslash nur x-mal vorkommen kann?
Oder gibt es noch andere Möglichkeiten?
Danke für eure Hilfe! :)

Mfg Kae
 
Müsste "Get-ChildItem c:\1-Ebene-B\ | ? { $_.PSisContainer -eq $true} | % {write-host $_.fullname} | Get-Unique" nicht funktionieren?

Edit: Das von mir ist ja Unsinn, hätt dein Anliegen richtig lesen sollen.
 
Zuletzt bearbeitet:
Code:
Get-ChildItem C:\ | foreach-object {get-childitem $_.fullname} | Where-Object{($_.PSIsContainer)} | % {write-host $_.fullname}


[FONT=&quot][/FONT]
 
@nixdagibts
Tausendmal Danke! :schluck::cheerlead:
Auf die Idee mit der Verschachtelung bin ich irgendwie nicht bekommen... :(
Jetzt hab ich dann direkt aber noch eine kleine Frage: Ich würde gerne alle Ordner mit einem führenden "_" ausschließen. Ein simples -exclude _ klappt leider nicht. :(

@ Saio
joa, das bringt leider nicht viel, so ähnlich sehen meine ersten Versuche auch aus! ;)

Mfg Kae

EDITh sagt: Und noch eine kleine Frage: Was genau macht das % da?^^
 
Zuletzt bearbeitet:
Ordner die mit _ beginnen kannst du so ausschließen (siehe das 2. where):
Code:
ls | ls | ? { $_.psiscontainer } | ? { $_.name -match "^[^_]" } | % { write $_.fullname }

Zur Erklärung:
ls --> Kurzform von Get-Child-Item
? --> Kurzform von Where-Object
% --> Kurzform von ForEach-Object
write --> Kurzform von Write-Host
-match --> vergleicht den Linken Teil (in diesem Fall $_.name) mit einem Regulären Ausdruck (Regular Expression / Regex)

Die regular expression bedeutet, der name muss mit einem bestimmten Zeichen beginnen (das erste ^ steht dafür das der Anfang der Zeichenfolge betrachtet werden soll).
Es sollen aber nur bestimmte Zeichen erlaubt sein. Welche das sind, steht in den eckigen Klammern.
Der Teil innerhalb der Eckigen Klammern bedeutet, dass der Unterstrich nicht erlaubt sein soll.

Der gesamte (reguläre) Ausdruck ergibt also true für alle Ordner die mit einem Zeichen ungleich dem Unterstrich beginnen.

Wenn du mehr über Regex wissen willst, einfach googeln, gibt tausende gute Tutorials dazu.
 
Falls du eine übersichtliche Nachschlagequelle für Powershell benötigst: http://ss64.com/ps/
Ganz unten sind auch die gängigsten Alias erklärt.[FONT=&quot][/FONT]
 
PowerShell:
> Filename.txt
anhängen, dass schreibt die Ausgabe in dein textfile im working directory. Alternativ gleichden ganzen Pfad rein schreiben.

Und nächstes mal bitte schauen wie alt der Thread ist :)
Du darfst gerne einen eigenen erstellen :)
 
Servus, hat nicht funktioniert. :confused_alt:

Nach etwas herumsuchen. Vorherigen löschen der txt geht es wenn man | % {write-host $.fullname} durch | % {$.fullname >> C:\File.txt} ersetzt.

Ok, werde ich machen. Und danke für die schnelle Antwort.
 
Nur zur Info, inzwischen ist Powershell doch etwas moderner als 2013 und Get-ChildItem kennt -Recurse, -Depth 2 sowie -Directory.

Nachfiltern bleibt erforderlich, aber insbesondere -Depth n hilft dabei, bei der Rekursion nicht stupide in die paar-und-hundertste Ebene runterzuklettern... obwohl wir maximal an der zweiten interessiert sind.
 
  • Gefällt mir
Reaktionen: pizza4ever und Zensai
Danke, schaut auch gleich viel besser aus ;)
Code:
Get-ChildItem C:\ -Depth 1 -Directory | % {$_.fullname >> C:\Liste.txt}
 
Als Ergänzung noch zwei Hinweise:
Ich würde möglichst keine Aliase in Cmdlets verwenden, da das immer wieder zu Problemen führen kann.

Also, wie in dem Beispiel hier: Statt % "Where-Object" und statt >> "Out-File".
Ich würde bei solchen Ausgaben auch, wenn möglich, dahinter immer ein Out-Null, oder davor ein
[Void] setzen.
Vor allem bei sehr komplexen Skripten kann das sehr sinnvoll in Sachen Geschwindigkeit sein.

Ich würde Pfadangaben immer in Anführungszeichen "C:\Mein Verzeichnis" setzen.
Denn wenn da Leer- oder Sonderzeichen enthalten sind, führt das auch immer wieder zu Problemen.

Das und noch so einiges mehr habe ich mir angewöhnt und erspart mir heute sehr viel Zeit, die ich früher mit unnötige Fehlersuche verschwendet hatte.
 
  • Gefällt mir
Reaktionen: pizza4ever
Zurück
Oben