PowerShell удаляет рекурсивную переменную своего полного пути - PullRequest
0 голосов
/ 18 января 2019

У меня есть простой скрипт для обхода дерева каталогов.

function GetSubFolders([IO.DirectoryInfo]$folder) {
    Write-Host "Getting folder $folder"

    Get-ChildItem $folder | ? { $_.PSIsContainer } | % { GetSubFolders $_ }
}

Если я позвоню GetSubFolders "c:\temp", произойдет сбой для каждого подкаталога, найденного в c: \ temp:

Get-ChildItem: Невозможно найти путь 'C: \ WINDOWS \ system32 \ somefolder

Где "somefolder" - это подкаталог c: \ temp. Переменная $_ явно является System.IO.DirectoryInfo объектом, но почему она лишена своего абсолютного пути и внезапно создана относительно текущего каталога, c: \ windows \ system32? Обратите внимание, что при входе в этот метод он правильно выводит

Получение папки c: \ temp

Это означает, что он работает один раз, поэтому не может быть проблем с Get-ChildItem принятием объекта DirectoryInfo в качестве параметра.

Ответы [ 3 ]

0 голосов
/ 18 января 2019
function GetSubFolders([IO.DirectoryInfo]$folder) {
    Write-Host "Getting folder $folder"
    Get-ChildItem $folder | ? { $_.PSIsContainer } | % { GetSubFolders $_.FullName }
}

Я думаю, что вы ищете недвижимость FullName.

0 голосов
/ 18 января 2019

Решение с рекурсией / трубами довольно неэффективно. Как и другие, лучше использовать переключатель -recurse с GCI. Но есть и альтернатива циклу / очереди. Это будет работать для любого вида объектов дерева - проходить через дочерние элементы корневого узла, и, если у дочернего элемента есть больше узлов, - добавлять его в очередь.

function Get-SubfolderQueue { param([IO.directoryinfo]$dir)

 $queue = New-Object System.Collections.Queue
 $queue.Enqueue($dir)

 While($queue.Count -gt 0) {
    $curr = $queue.Dequeue()
    foreach ($d in $curr.GetDirectories()) {
        Write-Output $d
        If($d.GetDirectories().Count -gt 0) { 
           $queue.Enqueue($d)
         }
    }
 }

}
0 голосов
/ 18 января 2019

Попробуйте использовать

Get-ChildItem -Path 'c:\temp' -Recurse -Directory

Флаг каталога будет доступен в V3. Если вы не используете V3, вы также можете использовать

Get-ChildItem -Path 'c:\temp' -Recurse | ? { $_.PSIsContainer }

Edit:

Флаг каталога доступен в V3. Спасибо Ansgar Wiechers за ваш комментарий.

...