2016-08-09 4 views
0

Я работал над сценарием PowerShell, который сохранит структуру каталогов при вклеивании вложенных папок. Тем не менее, мне немного сложно получить логику рекурсии.Recursion Logic

Это грубо, поэтому кода ошибки try/catch пока нет. Я прокомментировал Remove-Item, чтобы предотвратить случайные прогоны.

Логика, которую я разработал для этого, заключается в следующем.

  • Проверить & прибудет баз дерево подкаталогов
  • Go один уровень и проверить снова
  • Продолжайте, пока не каталогов, а затем вернуться на один уровень вверх.
  • Каталог каталогов, удалить каталог, записать журнал для автоматического извлечения (имена файлов подкаталогов кабины). Следующий уровень
  • Повторите процесс и будет продолжаться до базового каталога
function Chkfordir ($clevel) 
{ 
    $dir = dir $clevel | ? { $_.PSIsContainer -eq $true } #Does Current Level have Folders? 
    if($dir -ne $null) # Yes 
    { 
     Chkfordir $dir  #Go Deeper 
    } 
    if ($dir -eq $null) #Deepest Branch 
    { 
     return    # Go Back One Level and begin Cabbing 
    } 

    $dir | % { 
     Compress-Directory $_.FullName (".\" + [string]$_.Name + ".cab") 
     echo ($_.FullName + ".cab" >> .\cleaf.log" 
     #Remove-Item -Recurse $_.FullName 
     return 
    } 
} 

Вызов функции Compress-Directory от here.

Редактировать Изменения:

Will Re-Post Code Скоро (08/18)

Edit 08/18 Так что я, наконец, имел возможность проверить это и логика, кажется, работает в настоящее время. Были некоторые проблемы.

Большая часть трудностей связана с наличием powershell и незаметной проблемой, что Compress-Directory не является независимой от пути. Похоже, мне понадобится перезаписать эту функцию позже, чтобы быть независимой от пути.

Снятая с производства мощность была в изменении типа для значения на трубопроводе. По-видимому, после возврата из каталога функций элементы меняются из System.IO.FileInfo в System.IO.DirectoryInfo с помощью разных функций-членов.

Echo был заменен Add-Content, поскольку операторы перенаправления не работают в powershell.

Были некоторые неучтенные состояния, с которыми можно было бы бороться. Каталог листьев, у которых не было файлов, приведет к ошибке Compress-Directory или завершению без создания файла (таким образом, не сохраняя иерархию).

Решение должно заключаться в добавлении содержимого для папок листьев перед возвратом и перемещении Add-Content перед Compress-Directory, поэтому в каждом каталоге есть как минимум один файл.

Я включил мою текущую версию ниже, но это незавершенная работа.

function Chkfordir ($clevel) 
{ 
    $dir = dir $clevel | ? { $_.PSIsContainer -eq $true } # Get Folders? 
    if ($dir -eq $null) { #Check if deepest branch 
     Add-Content (Join-Path $_.PSPath "\leaf.log") ([string]$_.FullName + ".cab") 
     return $_    # Return one level up and cab 
    } 

    $dir | % { #for each sub go deeper 
     Chkfordir $_.FullName 
     Add-Content (Join-Path $_.PSParentPath "\branch.log") ([string]$_.FullName + ".cab") 
     Compress-Directory $_.FullName ([string]$_.Name + ".cab") 
     #Remove-Item $_.FullName -recurse 
    }   
} 

ответ

0

Вы должны рекурсию для каждого подкаталога и сжать его после рекурсивного вызова возвращается:

function Chkfordir($clevel) { 
    Get-ChildItem $clevel | 
     Where-Object { $_.PSIsContainer } | 
     ForEach-Object { 
      Chkfordir $_ 
      Compress-Directory ... 
      ... 
     } 
} 

Таким образом, вы автоматически опускаются, а затем создать архивы, как вы вернетесь.

+0

Спасибо, я не заметил, что он не брал каждый подкаталог и не возвращался оттуда. Я обновил код, и я буду тестировать его позже сегодня, когда у меня будет время. – Lorek