Итерация в алфавитном порядке, в порядке глубины? - PullRequest
0 голосов
/ 25 февраля 2019

Как перебрать папку так, чтобы я соблюдал алфавитный (лексический) порядок, но возвращался в любые каталоги, прежде чем перейти к следующему элементу старого каталога?

Пример структуры для пояснения:

Alpha
  |- 1.txt
  |- 2.txt
  |- 3
  |  |- a.txt
  |  \- b.txt
  \- 4.txt
Beta
  \- Test
     \- Another
        \- File.txt

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

Alpha
1.txt
2.txt
3
a.txt
b.txt
4.txt
Beta
Test
Another
File

Однако,Кажется, я не могу понять, как правильно выполнить и рекурсию, и упорядочение без создания действительно неприятного беспорядка вложенной Get-ChildItem с ручной рекурсией, но я надеюсь, что есть более аккуратный способ, которому я также могу научиться.

Если по какой-либо причине это слишком сложно реализовать, то резервирование порядка, в котором обрабатываются элементы, является основным моментом для меня, поскольку я могу обойтись без сохранения древовидной структуры, если потребуется.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Может быть решена с помощью простой рекурсивной функции-обёртки:

function Get-ChildItemDepthFirst
{
  param(
    [Parameter(Mandatory = $true)]
    [ValidateScript({Test-Path $_ -PathType Container})]
    [string]$LiteralPath = $PWD
  )

  foreach($item in Get-ChildItem @PSBoundParameters){
    # Output current item name
    $item.Name
    # Check to see if item is a folder, if so recurse
    if($item -is [System.IO.DirectoryInfo]){
      Get-ChildItemDepthFirst -LiteralPath $item.FullName
    }
  }
}

FWIW, я бы лично выбрал элегантный подход Джеймса С.

0 голосов
/ 25 февраля 2019

Нет необходимости в ручной рекурсии, Get-ChildItem будет делать то, что вы хотите, когда вы также используете Sort-Object и Select-Object.

  • Get-ChildItem с Recurse, чтобы получить список элементов
  • sort с помощью FullName для размещения элементов в нужном вам порядке
  • select свойство Name для отображения только элементов Имя

Дает:

Get-ChildItem C:\folder -Recurse | sort FullName | select -ExpandProperty Name

Alpha
1.txt
2.txt
3
a.txt
b.txt
4.txt
Beta
Test
Another
file.txt
...