Из-за некоторых смягчающих обстоятельств нам пришлось прибегнуть к переносу контента команд из одной фермы в другую посредством локальной загрузки файлов из их списков и их отправки. К сожалению, эта команда ОЧЕНЬ активно использовала папки в своих списках. И они хотели сохранить структуру своих папок для организации документов, поэтому мне пришлось придумать сценарий, который мог бы загружать содержимое списка, папок и всего, при этом также поддерживая эту структуру папок. У меня многолетний опыт администрирования SP, но мои сценарии PS всегда были в лучшем случае основаны на c промежуточном использовании, поэтому я обращаюсь ко всем вам за помощью в оптимизации этого сценария.
add-pssnapin microsoft.sharepoint.powershell
$w=get-spweb "http://URL"
$tlfolder=$w.getfolder("Old_Surveys")
$subfold=$tlfolder.subfolders|select *|?{$_.name -match "historical"}
$subfolders=$subfold.subfolders
foreach ($subfolder in $subfolders)
{
new-item -path "D:\backups\Old_Surveys\Historical Company Surveys" -name $subfolder.name -itemtype "directory"
#if the 2 level sub folder exists
if ($subfolder.subfolders -ne $null)
{
$subfoldername=$subfolder.name
$subsubfolders=$subfolder.subfolders
foreach ($subsubfolder in $subsubfolders)
{
new-item -path "D:\backups\Old_Surveys\Historical Company Surveys\$subfoldername" -name $subsubfolder.name -itemtype "directory"
# if the 3 level sub folder exists
if ($subsubfolder.subfolders -ne $null)
{
$subsubfoldername=$subsubfolder.name
$subsubsubfolders=$subsubfolder.subfolders
foreach ($subsubsubfolder in $subsubsubfolders)
{
new-item -path "D:\backups\Old_Surveys\Historical Company Surveys\$subfoldername\$subsubfoldername" -name $subsubsubfolder.name -itemtype "directory"
#if the 3 level sub files exists
if ($subsubsubfolder.files -ne $null)
{
$subsubsubfiles=$subsubsubfolder.files
$subsubsubfoldername=$subsubsubfolder.name
foreach ($subsubsubfile in $subsubsubfiles)
{
write-host $subsubsubfile.name
$b=$subsubsubfile.openbinary()
$fs=new-object system.io.filestream(("d:\backups\Old_Surveys\Historical Company Surveys\$subfoldername\$subsubfoldername\$subsubsubfoldername"+$subsubsubfile.name), [system.io.filemode]::create)
$bw=new-object system.io.binarywriter($fs)
$bw.write($b)
$bw.close()
}
}
}
}
if ($subsubfolder.files -ne $null)
{
$subsubfiles=$subsubfolder.files
$subsubfoldername=$subsubfolder.name
foreach ($subsubfile in $subsubfiles)
{
write-host $subsubfile.name
$b=$subsubfile.openbinary()
$fs=new-object system.io.filestream(("d:\backups\Old_Surveys\Historical Company Surveys\$subfoldername\$subsubfoldername\"+$subsubfile.name), [system.io.filemode]::create)
$bw=new-object system.io.binarywriter($fs)
$bw.write($b)
$bw.close()
}
}
}
if ($subfolder.files -ne $null)
{
$subfiles=$subfolder.files
$subfoldername=$subfolder.name
foreach ($subfile in $subfiles)
{
write-host $subfile.name
$b=$subfile.openbinary()
$fs=new-object system.io.filestream(("d:\backups\Old_Surveys\Historical Company Surveys\$subfoldername\"+$subfile.name), [system.io.filemode]::create)
$bw=new-object system.io.binarywriter($fs)
$bw.write($b)
$bw.close()
}
}
}
}
Целью кода было перебирать любые папки и подпапки папок, создавать их на локальном диске и загружать любые файлы, находящиеся в них на этом уровне. Я сделал это вручную для 3-х уровней вложенности папок, но если уровней ниже, чем это, мне пришлось бы вручную добавлять весь код и работать еще дольше. Конечно, должен быть лучший способ сделать это?