Предельная глубина рекурсии Get-ChildItem

Я могу получить все подпункты рекурсивно с помощью этой команды:

Get-ChildItem -recurse

Но есть ли способ ограничить глубину? Например, хочу ли я вернуться на один или два уровня вниз?

Ответы на вопрос(6)

По состоянию на powershell 5.0Теперь вы можете использовать-Depth параметр в!Get-ChildItem

Вы комбинируете это с-Recurse ограничить рекурсию.

Get-ChildItem -Recurse -Depth 2
 Charlie Joynt14 февр. 2017 г., 11:14
Кажется, что-Recurse переключатель является необязательным / подразумевается, когда-Depth указано.
 ssaviers16 мар. 2017 г., 18:29
Одна вещь, которую я нашел с этим, который кажется странным,-Exclude когда включено с-Depth отрицает-Depth значение.
Решение Вопроса

Ты можешь попробовать:

Get-ChildItem \*\*\*

Это возвращает все элементы с глубиной двух подпапок. Добавление \ * добавляет дополнительную подпапку для поиска в.

В соответствии с вопросом OP, чтобы ограничить рекурсивный поиск с использованием get-childitem, вы должны указать все глубины, которые можно искать.

Get-ChildItem \*\*\*,\*\*,\*

Вернет детей на каждой глубине 2,1 и 0

 CB.06 нояб. 2012 г., 13:26
Рад помочь!!!
 Gerard ONeill05 сент. 2013 г., 00:10
Похоже, ты должен сделать-дорожка \*\*\*,\*\*,\*" тянуть в промежуточные глубины.
 Svish06 нояб. 2012 г., 13:09
DOH Конечно ... теперь так очевидно, лол. Спасибо :)
 aphoria06 нояб. 2012 г., 12:57
Так круто. Я предполагаю, что я'Мне никогда не приходилось делать это в PowerShell, но я знаю, что раньше хотел этого в CMD.EXE.
 lit26 апр. 2019 г., 16:55
Чтобы начать рекурсию из текущего каталога, необходимо добавить точку в начале каждого пути.Get-ChildItem .\*\*\*,.\*\*,.\* В какой-то момент, в PowerShell 5.1, Get-ChildItem теперь имеет-Depth параметр.
 Royi19 июл. 2016 г., 13:34
Я попробовал, но кажется, что он идет вверх, а не вниз. Как я могу использовать его для создания дерева папок, как вsuperuser.com/questions/258287/... ? Благодарю вас.

@scanlegentil Мне это нравится.

Небольшое улучшение будет:

$Depth = 2
$Path = "."

$Levels = "\*" * $Depth
$Folder = Get-Item $Path
$FolderFullName = $Folder.FullName
Resolve-Path $FolderFullName$Levels | Get-Item | ? {$_.PsIsContainer} | Write-Host

Как уже упоминалось, это будет сканировать только указанную глубину, поэтому эта модификация является улучшением:

$StartLevel = 1 # 0 = include base folder, 1 = sub-folders only, 2 = start at 2nd level
$Depth = 2      # How many levels deep to scan
$Path = "."     # starting path

For ($i=$StartLevel; $i -le $Depth; $i++) {
    $Levels = "\*" * $i
    (Resolve-Path $Path$Levels).ProviderPath | Get-Item | Where PsIsContainer |
    Select FullName
}
 kevro07 янв. 2015 г., 23:27
Это покажет все имена подпапок до указанной глубины
 sancho.s03 мая 2015 г., 15:45
Похоже, чтобы показать элементыв заданная глубина, а невплоть до заданная глубина.

Эта функция выводит одну строку на элемент с отступом в соответствии с уровнем глубины. Это, вероятно, гораздо более читабельным.

function GetDirs($path = $pwd, [Byte]$ToDepth = 255, [Byte]$CurrentDepth = 0)
{
    $CurrentDepth++
    If ($CurrentDepth -le $ToDepth) {
        foreach ($item in Get-ChildItem $path)
        {
            if (Test-Path $item.FullName -PathType Container)
            {
                "." * $CurrentDepth + $item.FullName
                GetDirs $item.FullName -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
        }
    }
}

Это основано на сообщении в блоге,Практическая PowerShell: удаление файловых деревьев и расширение командлетов.

Попробуйте эту функцию:

Function Get-ChildItemToDepth {
    Param(
        [String]$Path = $PWD,
        [String]$Filter = "*",
        [Byte]$ToDepth = 255,
        [Byte]$CurrentDepth = 0,
        [Switch]$DebugMode
    )

    $CurrentDepth++
    If ($DebugMode) {
        $DebugPreference = "Continue"
    }

    Get-ChildItem $Path | %{
        $_ | ?{ $_.Name -Like $Filter }

        If ($_.PsIsContainer) {
            If ($CurrentDepth -le $ToDepth) {

                # Callback to this function
                Get-ChildItemToDepth -Path $_.FullName -Filter $Filter `
                  -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
            Else {
                Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + `
                  "(Why: Current depth $CurrentDepth vs limit depth $ToDepth)")
            }
        }
    }
}

источник

 Peter Mortensen10 янв. 2019 г., 20:51
Это на самом деле работает. Пример вызова:Get-ChildItemToDepth -ToDepth 2 (работает в текущем каталоге)
 enorl7601 мар. 2013 г., 23:08
+1 за собственно написание функции;)

Я пытался ограничить глубину рекурсии Get-ChildItem, используя Resolve-Path

$PATH = "."
$folder = get-item $PATH 
$FolderFullName = $Folder.FullName
$PATHs = Resolve-Path $FolderFullName\*\*\*\
$Folders = $PATHs | get-item | where {$_.PsIsContainer}

Но это прекрасно работает:

gci "$PATH\*\*\*\*"

Ваш ответ на вопрос