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 ?
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 ?
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.
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
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)")
}
}
}
}
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\*\*\*\*"
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 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.