Jak mogę uzyskać tylko katalogi za pomocą Get-ChildItem?


Używam programu PowerShell 2,0 i chcę przekazać wszystkie podkatalogi określonej ścieżki. Następujące polecenie wyświetla wszystkie pliki i katalogi, ale nie mogę dowiedzieć się, jak odfiltrować pliki.
Get-ChildItem c:\mypath -Recurse

Próbowałem użyć
$ _. Attributes
, aby uzyskać atrybuty, ale potem nie wiem, jak zbudować dosłowne wystąpienie
System.IO.FileAttributes
, aby je porównać . W
cmd.exe
byłoby to
dir/b/ad/s

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


W przypadku wersji programu PowerShell mniejszych niż 3,0

:
Obiekt
FileInfo
zwrócony przez
Get-ChildItem
ma właściwość podstawową
PSIsContainer
. Chcesz tylko zaznaczyć te elementy.
Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

Jeśli chcesz, aby nazwy ciągów katalogów surowych były możliwe, możesz to zrobić
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName


Dla programu PowerShell 3,0 i nowszych

:
dir -Directory
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W PowerShell 3.0 wszystko jest prostsze:
Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zdobyć przewagę
Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files

Jeśli wolisz aliasy, użyj
ls -dir #lists only directories
ls -file #lists only files

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

Rekurencyjnie przeglądaj drzewo podkatalogów, a także dodaj możliwość
-r
.
ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively

Przetestowano na PowerShell 4,0, PowerShell 5,0 (Windows 10) i

PowerShell Core 6.0
https://github.com/powershell/powershell
(Windows 10, Mac i Linux).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Czystsze podejście:
Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

Zastanawiam się, czy PowerShell 3.0 ma przełącznik, który zwraca tylko katalogi; wydaje się logiczne, aby dodać.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się:
dir -r | where { $_ -is [System.IO.DirectoryInfo] }
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Począwszy od programu PowerShell v2 i nowszych (k reprezentuje folder, w którym rozpoczynasz wyszukiwanie):
Get-ChildItem $Path -attributes D -Recurse

Jeśli chcesz tylko nazwy folderów i nic więcej, użyj tego:
Get-ChildItem $Path -Name -attributes D -Recurse

Jeśli szukasz określonego folderu, możesz użyć następujących. W tym przypadku szukam folderu o nazwie
myFolder
:
Get-ChildItem $Path -attributes D -Recurse -include "myFolder"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To podejście wymaga mniej tekstu:
ls -r | ? {$_.mode -match "d"}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się:
dir -Directory -Recurse | Select FullName

To da ci wynik struktury katalogu głównego z nazwą folderu tylko dla katalogów.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Przyjęta odpowiedź wspomina
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

aby uzyskać „nieprzetworzony ciąg znaków”.
Ale w rzeczywistości zostaną zwrócone obiekty typu
Selected.System.IO.DirectoryInfo
. W przypadku nieprzetworzonych ciągów można użyć:
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

Różnica ma znaczenie, gdy wartość jest łączona z ciągiem znaków:
  • z
    Select-Object
    niesamowitym
    foo \ @ {FullName = bar}
  • z oczekiwaną instrukcją
    ForEach
    :
    foo \ bar
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się:
Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name | convertto-csv -NoTypeInformation | Out-File c:\temp\mydirectorylist.csv

Który wykonuje następujące czynności
  • Uzyskaj listę katalogów w lokalizacji docelowej:
    Get-ChildItem \\ myserver \ myshare \ myshare \ -Directory
  • Wyodrębnij tylko nazwy katalogów:
    Select-Object -Property name
  • Konwertuj do formatu CSV:
    convertto-csv -NoTypeInformation
  • Zapisz wynik do pliku:
    Out-File c: \ temp \ mydirectorylist.csv
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Będziesz chciał użyć

Get-ChildItem

aby najpierw rekurencyjnie pobrać wszystkie foldery i pliki. Następnie prześlij to wyjście do zdania

Where-Object

który akceptuje tylko pliki.
<pre class="lang-powershell prettyprint-override">
# 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 ;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nieco bardziej czytelne i prostsze podejście można osiągnąć za pomocą poniższego skryptu:
$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
if ($_.Attributes -eq "Directory") {
Write-Host $_.FullName
}
}

Mam nadzieję że to pomoże!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Moje rozwiązanie jest oparte na artykule TechNet „
zabawne rzeczy do zrobienia za pomocą polecenia cmdlet Get-ChildItem

https://technet.microsoft.com/ ... .aspx
".
Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

Użyłem go w swoim skrypcie i działa dobrze.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj tego:
Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby konkretnie odpowiedzieć na Twoje pierwotne pytanie (używając IO.FileAttributes):
Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}
Jednak wolę rozwiązanie Marka (
Where-Object {$ _ -is [System.IO.DirectoryInfo]}
).

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się