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
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
In PowerShell 3.0 ist dies einfacher:
Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
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).
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.
Benutzen:
dir -r | where { $_ -is [System.IO.DirectoryInfo] }
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"
Bei diesem Ansatz ist weniger Text erforderlich:
ls -r | ? {$_.mode -match "d"}
Benutzen:
dir -Directory -Recurse | Select FullName
Dadurch erhalten Sie eine Ausgabe der Stammstruktur mit dem Ordnernamen nur für Verzeichnisse.
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!
Benutzen:
Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name | convertto-csv -NoTypeInformation | Out-File c:\temp\mydirectorylist.csv
Was macht das Folgende?
Get-ChildItem \\myserver\myshare\myshare\ -Directory
Select-Object -Property name
convertto-csv -NoTypeInformation
Out-File c:\temp\mydirectorylist.csv
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:
Select-Object
überraschend foo\@{FullName=bar}
ForEach
- Operator das erwartete: foo\bar
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 ;
}
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.
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 ";"
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] }
).