Как получить только каталоги с помощью Get-ChildItem?

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

Get-ChildItem c:\mypath -Recurse 

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

 dir /b /ad /s 

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

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

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

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

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

Для PowerShell 3.0 и выше:

 dir -Directory 

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

 Get-ChildItem -Directory #List only directories Get-ChildItem -File #List only files 
 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).

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

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

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

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

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

Из 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" 

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

 ls -r | where {$_.mode -match "d"} 

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

 dir -Directory -Recurse | Select FullName 

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

С помощью нижеприведенного сценария можно было бы получить более понятный и простой подход:

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

Надеюсь это поможет!

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

 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

В принятом ответе упоминается

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

для получения «сырой строки». Но на самом деле будут возвращены объекты типа Selected.System.IO.DirectoryInfo . Для необработанных строк можно использовать:

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

Разница имеет значение, если значение конкатенируется со строкой:

  • с Select-Object suprisingly foo\@{FullName=bar}
  • с ForEach -оператором ожидается: foo\bar

Мое решение основано на статье TechNet « Полезные вещи, которые вы можете сделать с помощью командлета Get-ChildItem» .

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

Я использовал его в своем скрипте, и он работает хорошо.

Используйте это:

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

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

 # 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 ; } 

Чтобы ответить на исходный вопрос (используя IO.FileAttributes):

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

Я предпочитаю решение Марека ( Where-Object { $_ -is [System.IO.DirectoryInfo] } ).

  • Реализация PowerShell 2.0 ConvertFrom-Json и ConvertTo-Json
  • Каков наилучший способ определения местоположения текущего сценария PowerShell?
  • Как получить емкость диска и свободное место удаленного компьютера
  • Исключение цитат и двойных кавычек
  • Interesting Posts
    Давайте будем гением компьютера.