84 votes

Limiter la profondeur de récursion de Get-ChildItem

Je peux obtenir tous les sous-éléments de manière récursive à l'aide de cette commande :

Get-ChildItem -recurse

Mais existe-t-il un moyen de limiter la profondeur ? Si je ne veux rechercher qu'un ou deux niveaux plus bas, par exemple ?

115voto

CB. Points 24549

Cette option permet de limiter la profondeur à 2 :

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

Il renvoie les enfants à chaque profondeur 2, 1 et 0.


Explication :

Cette commande

Get-ChildItem \*\*\*

renvoie tous les éléments ayant une profondeur de deux sous-dossiers. L'ajout de \* ajoute un sous-dossier supplémentaire à la recherche.

En accord avec la question du PO, pour limiter une recherche récursive à l'aide de get-childitem, vous devez spécifier toutes les profondeurs qui peuvent être recherchées.

79voto

Vache Points 13219

A partir de powershell 5.0 vous pouvez maintenant utiliser la fonction -Depth paramètre dans Get-ChildItem !

Vous le combinez avec -Recurse pour limiter la récursivité.

Get-ChildItem -Recurse -Depth 2

9voto

walid2mi Points 1222

Essayez cette fonction :

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)")
            }
        }
    }
}

fuente

1voto

scanlegentil Points 1

J'ai essayé de limiter la profondeur de récursion de Get-ChildItem en utilisant Resolve-Path

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

Mais cela fonctionne bien :

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

1voto

sancho.s Points 1441

Il s'agit d'une fonction qui produit une ligne par élément, avec une indentation en fonction du niveau de profondeur. Elle est probablement beaucoup plus lisible.

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

Il est basé sur un article de blog, Practical PowerShell : Élaguer les arbres de fichiers et étendre les Cmdlets .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X