Как получить только каталоги, использующие Get-ChildItem? - PullRequest
215 голосов
/ 21 июня 2010

Я использую PowerShell 2.0, и я хочу передать все подкаталоги определенного пути.Следующая команда выводит все файлы и каталоги, но я не могу понять, как отфильтровать файлы.

Get-ChildItem c:\mypath -Recurse

Я пытался использовать $_.Attributes, чтобы получить атрибуты, но тогда я не могузнать, как создать буквальный экземпляр System.IO.FileAttributes, чтобы сравнить его с.В cmd.exe это будет

dir /b /ad /s

Ответы [ 15 ]

260 голосов
/ 21 июня 2010

Для версий PowerShell менее 3.0:

Объект FileInfo, возвращаемый Get-ChildItem, имеет свойство base, PSIsContainer. Вы хотите выбрать только эти элементы.

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

Если вам нужны необработанные строковые имена каталогов, вы можете сделать

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

Для PowerShell 3.0 и выше:

dir -Directory
175 голосов
/ 25 января 2013

В PowerShell 3.0 это проще:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
46 голосов
/ 28 марта 2015

Используйте

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

Если вы предпочитаете псевдонимы, используйте

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

или

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

Чтобы также найти подкаталоги, добавьте опцию -r.

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

Протестировано на PowerShell 4.0, PowerShell 5.0 (Windows 10) и PowerShell Core 6.0 (Windows 10, Mac и Linux).

21 голосов
/ 05 сентября 2012

Более чистый подход:

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

Интересно, есть ли в PowerShell 3.0 переключатель, который возвращает только каталоги; кажется логичным добавить.

11 голосов
/ 05 сентября 2012

Использование:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }
6 голосов
/ 25 октября 2013

В PowerShell v2 и новее (k обозначает папку, в которой вы начинаете поиск):

Get-ChildItem $Path -attributes D -Recurse

Если вам нужны только имена папок и ничего больше, используйте это:

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

Если вы ищете определенную папку, вы можете использовать следующее.В этом случае я ищу папку с именем myFolder:

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"
4 голосов
/ 12 июля 2014

Использование:

dir -Directory -Recurse | Select FullName

Это даст вам вывод корневой структуры с именем папки только для каталогов.

4 голосов
/ 22 апреля 2013

При таком подходе требуется меньше текста:

ls -r | ? {$_.mode -match "d"}
3 голосов
/ 20 октября 2014

Использование:

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

Что делает следующее

  • Получить список каталогов в целевом местоположении: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • Извлечь только имяиз каталогов: Select-Object -Property name
  • Преобразовать выходные данные в формат CSV: convertto-csv -NoTypeInformation
  • Сохранить результат в файл: Out-File c:\temp\mydirectorylist.csv
2 голосов
/ 12 января 2016

Вы захотите использовать Get-ChildItem , чтобы сначала рекурсивно получить все папки и файлы.А затем передайте эти выходные данные в предложение Where-Object , которое принимает только файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...