it-swarm.com.de

Wie bekomme ich nur Verzeichnisse, die Get-ChildItem verwenden?

Ich verwende PowerShell 2.0 und möchte alle Unterverzeichnisse eines bestimmten Pfads ausgeben. Der folgende Befehl gibt alle Dateien und Verzeichnisse aus, aber ich kann nicht herausfinden, wie die Dateien herausgefiltert werden.

Get-ChildItem c:\mypath -Recurse

Ich habe versucht, $_.Attributes zu verwenden, um die Attribute abzurufen, aber ich weiß nicht, wie ich eine literale Instanz von System.IO.FileAttributes zum Vergleich erstellen kann. In cmd.exe wäre das so 

dir /b /ad /s
193
Peter Hull

Für PowerShell-Versionen unter 3.0:

Das von Get-ChildItem zurückgegebene FileInfo-Objekt hat die Eigenschaft "base" PSIsContainer. Sie möchten nur diese Elemente auswählen.

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

Wenn Sie die rohen Zeichenfolgennamen der Verzeichnisse wünschen, können Sie dies tun

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

Für PowerShell 3.0 und höher:

dir -Directory
244
xcud

In PowerShell 3.0 ist dies einfacher:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
163
iraSenthil
Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files

Wenn Sie Aliase bevorzugen, verwenden Sie

ls -dir #lists only directories
ls -file #lists only files

oder

dir -dir #lists only directories
dir -file #lists only files

Fügen Sie auch die Option -r hinzu, um Unterverzeichnisse erneut anzuzeigen.

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 

Getestet unter PowerShell 4.0, PowerShell 5.0 (Windows 10) und PowerShell Core 6.0 (Windows 10, Mac und Linux).

44
Sachin Joseph

Ein sauberer Ansatz:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

Ich frage mich, ob PowerShell 3.0 einen Schalter hat, der nur Verzeichnisse zurückgibt. es scheint eine logische Sache zu sein.

19
Carlos Nunez

Benutzen:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }
11

Ab PowerShell v2 und neuer (k steht für den Ordner, in dem Sie Ihre Suche beginnen):

Get-ChildItem $Path -attributes D -Recurse

Wenn Sie nur die Ordnernamen und nichts anderes möchten, verwenden Sie Folgendes:

Get-ChildItem $Path -Name -attributes D -Recurse

Wenn Sie nach einem bestimmten Ordner suchen, können Sie Folgendes verwenden. In diesem Fall suche ich nach einem Ordner namens myFolder:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"
6
Bill

Bei diesem Ansatz ist weniger Text erforderlich:

ls -r | ? {$_.mode -match "d"}
4
jyggorath

Benutzen:

dir -Directory -Recurse | Select FullName

Dadurch erhalten Sie eine Ausgabe der Stammstruktur mit dem Ordnernamen nur für Verzeichnisse.

3
Wesley

Ein etwas lesbarerer und einfacher Ansatz könnte mit dem folgenden Skript erreicht werden:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

Hoffe das hilft!

2
Zorayr

Benutzen:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

Was macht das Folgende?

  • Rufen Sie eine Liste von Verzeichnissen am Zielspeicherort ab: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • Extrahieren Sie nur den Namen der Verzeichnisse: Select-Object -Property name 
  • Konvertieren Sie die Ausgabe in das CSV-Format: convertto-csv -NoTypeInformation 
  • Speichern Sie das Ergebnis in einer Datei: Out-File c:\temp\mydirectorylist.csv
2
Marty Gomez

Die akzeptierte Antwort erwähnt

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

um einen "rohen String" zu erhalten . Tatsächlich werden Objekte vom Typ Selected.System.IO.DirectoryInfo zurückgegeben. Für rohe Zeichenketten kann Folgendes verwendet werden:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

Der Unterschied ist wichtig, wenn der Wert mit einer Zeichenfolge verkettet ist:

  • mit Select-Object überraschend foo\@{FullName=bar}
  • mit dem ForEach- Operator das erwartete: foo\bar
1
sevenforce

Sie sollten Get-ChildItem verwenden, um alle Ordner und Dateien zuerst rekursiv abzurufen. Und dann diese Ausgabe in eine Where-Object - Klausel weiterleiten, die nur die Dateien übernimmt.

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}
1
sonjz

Meine Lösung basiert auf dem TechNet-Artikel Spaß mit dem Cmdlet Get-ChildItem.

Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

Ich habe es in meinem Skript verwendet, und es funktioniert gut.

1
Sarrus

Verwende das hier:

Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"
0
Hansli

Um die ursprüngliche Frage speziell zu beantworten (mithilfe von IO.FileAttributes):

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

Ich bevorzuge die Lösung von Marek (Where-Object { $_ -is [System.IO.DirectoryInfo] }).

0
Nico57