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


Answers

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

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files
Question

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

Get-ChildItem c:\mypath -Recurse

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

dir /b /ad /s



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

dir -Directory -Recurse | Select FullName

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




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



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

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 для рекурсивного получения всех папок и файлов в первую очередь. А затем канал, который выводится в предложение 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 ;
}



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

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

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







Links