Я работал над сценарием 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
}
}
Спасибо, я не заметил, что он не брал каждый подкаталог и не возвращался оттуда. Я обновил код, и я буду тестировать его позже сегодня, когда у меня будет время. – Lorek