Limiter la profondeur de récursion Get-ChildItem

Je peux obtenir tous les sous-éléments de manière récursive en utilisant cette commande:

Get-ChildItem -recurse 

Mais y a-t-il un moyen de limiter la profondeur? Par exemple, si je veux seulement faire reculer un ou deux niveaux?

Tu peux essayer:

 Get-ChildItem \*\*\* 

Cela retourne tous les éléments avec une profondeur de deux sous-dossiers. L’ajout de \ * ajoute un sous-dossier supplémentaire à rechercher.

Conformément à la question OP pour limiter une recherche récursive à l’aide de get-childitem, vous devez spécifier toutes les profondeurs pouvant être recherchées.

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

Rendra les enfants à chaque profondeur 2,1 et 0

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

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

 Get-ChildItem -Recurse -Depth 2 

Essayez cette fonction:

 Function Get-ChildItemToDepth { Param( [Ssortingng]$Path = $PWD, [Ssortingng]$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)") } } } } 

la source

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\*\*\*\*" 

C’est une fonction qui génère une ligne par élément, avec une indentation en fonction du niveau de profondeur. C’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: Arborescence de fichiers d’élagage et Extension de cmdlets .

@scanlegentil J’aime ça.
Une petite amélioration serait:

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

Comme mentionné, cela ne ferait que scanner la profondeur spécifiée, donc cette modification est une amélioration:

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