Это будет сделано.
Get-ChildItem
выполняется на верхнем уровне для заполнения очереди обработки ($ProcessingQueue
)
Затем, al oop будет работать до тех пор, пока обработка В очереди не осталось ни одного элемента. Каждый элемент в очереди будет под go одним и тем же процессом.
Либо он соответствует фильтру, в этом случае он будет добавлен в переменную $Result
, либо нет, в этом случае Get-ChildItem
будет вызван в этом каталоге, а его результат добавлен в очередь.
Это гарантирует, что мы больше не будем обрабатывать дерево каталогов после совпадения и что рекурсия применяется только в том случае, если каталог не совпадал с папкой.
- -
Function Get-TopChildItem($Path, $Filter) {
$Results = [System.Collections.Generic.List[String]]::New()
$ProcessingQueue = [System.Collections.Queue]::new()
ForEach ($item in (Get-ChildItem -Directory $Path)) {
$ProcessingQueue.Enqueue($item.FullName)
}
While ($ProcessingQueue.Count -gt 0) {
$Item = $ProcessingQueue.Dequeue()
if ($Item -match $Filter) {
$Results.Add($Item)
}
else {
ForEach ($el in (Get-ChildItem -Path $Item -Directory)) {
$ProcessingQueue.Enqueue($el.FullName)
}
}
}
return $Results
}
#Example
Get-TopChildItem -Path "C:\_\111" -Filter 'obj'