Korzystam z programu PowerShell 2.0 i chcę wyodrębnić wszystkie podkatalogi określonej ścieżki. Poniższe polecenie wyświetla wszystkie pliki i katalogi, ale nie mogę wymyślić, jak je odfiltrować.
Get-ChildItem c:\mypath -Recurse
Próbowałem użyć, $_.Attributes
aby uzyskać atrybuty, ale nie wiem, jak skonstruować dosłowne wystąpienie, System.IO.FileAttributes
aby je porównać. W cmd.exe
byłoby
dir /b /ad /s
powershell
powershell-2.0
Peter Hull
źródło
źródło
W PowerShell 3.0 jest to prostsze:
źródło
dir
został pseudonimGet-ChildItem
,-Directory
a-File
opcje i działały zgodnie z opisem. Użyłem poleceniaecho $PSVersionTable
,help dir
,dir -Directory
idir -File
wymyślić ten komentarz.ls
idir
pseudonimyGet-ChildItem
wybierz swoją truciznęPosługiwać się
Jeśli wolisz aliasy, użyj
lub
Aby rekursować również podkatalogi, dodaj
-r
opcję.Testowane na PowerShell 4.0, PowerShell 5.0 (Windows 10), PowerShell Core 6.0 (Windows 10, Mac i Linux) oraz PowerShell 7.0 (Windows 10, Mac i Linux).
Uwaga : W programie PowerShell Core łącza symboliczne nie są przestrzegane po określeniu
-r
przełącznika. Aby podążać za dowiązaniami symbolicznymi, określ-FollowSymlink
przełącznik za pomocą-r
.Uwaga 2 : PowerShell jest teraz wieloplatformowy od wersji 6.0. Wersja wieloplatformowa pierwotnie nosiła nazwę PowerShell Core, ale słowo „Core” zostało porzucone od PowerShell 7.0+.
Dokumentacja Get-ChildItem: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem
źródło
Czystsze podejście:
Zastanawiam się, czy PowerShell 3.0 ma przełącznik, który zwraca tylko katalogi; wydaje się logiczną rzeczą do dodania.
źródło
-Directory
i-File
Posługiwać się:
źródło
Z PowerShell v2 i nowszych (k reprezentuje folder, w którym zaczynasz wyszukiwanie):
Jeśli chcesz tylko nazwy folderów i nic więcej, użyj tego:
Jeśli szukasz określonego folderu, możesz użyć następujących. W takim przypadku szukam folderu o nazwie
myFolder
:źródło
Przy takim podejściu wymagany jest mniej tekstu:
źródło
Posługiwać się:
To da ci wynik struktury głównej z nazwą folderu tylko dla katalogów.
źródło
Posługiwać się:
Który wykonuje następujące czynności
Get-ChildItem \\myserver\myshare\myshare\ -Directory
Select-Object -Property name
convertto-csv -NoTypeInformation
Out-File c:\temp\mydirectorylist.csv
źródło
Trochę bardziej czytelne i proste podejście można osiągnąć za pomocą poniższego skryptu:
Mam nadzieję że to pomoże!
źródło
Będziesz chciał użyć Get-ChildItem do rekurencyjnego pobrania wszystkich folderów i plików w pierwszej kolejności. Następnie potokuj dane wyjściowe do klauzuli Where-Object , która pobiera tylko pliki.
źródło
Przyjęta odpowiedź wspomina
aby uzyskać „nieprzetworzony ciąg”. Ale w rzeczywistości obiekty typu
Selected.System.IO.DirectoryInfo
zostaną zwrócone. W przypadku ciągów surowych można użyć:Różnica ma znaczenie, jeśli wartość jest konkatenowana do łańcucha:
Select-Object
zaskakującofoo\@{FullName=bar}
ForEach
operatorem oczekiwane:foo\bar
źródło
Select-Object -ExpandProperty FullName
Moje rozwiązanie jest oparte na artykule TechNet Zabawne rzeczy, które możesz zrobić dzięki poleceniu Get-ChildItem .
Użyłem go w moim skrypcie i działa dobrze.
źródło
Użyj tego:
źródło
Aby konkretnie odpowiedzieć na oryginalne pytanie (przy użyciu IO.FileAttributes):
Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}
Wolę jednak rozwiązanie Marka (
Where-Object { $_ -is [System.IO.DirectoryInfo] }
).źródło