Игнорирование подкаталогов в powershell - PullRequest
1 голос
/ 08 января 2020

У меня есть строка кода, которая распечатывает все файлы и папки, которые похожи на $ filename. Например, ключевое слово «ab c» будет также включать файл / папку «abcdef»

Get-ChildItem -Path 'C:\' -Filter $filename -Recurse | %{$_.FullName}

Я хотел бы сделать так, чтобы поиск этих файлов не go в подкаталогах папок

например, папка с именем "ab c" и подпапка "abcdef" выводит только "C: \ ab c"

В настоящее время строка кода будет выводить "C: \ ab c" и "C: \ abc \ abcdef"

Как лучше всего это сделать?

1 Ответ

1 голос
/ 08 января 2020

Это будет сделано.

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'
...