Развертываете шаблон сайта и создаете его в том же сценарии PowerShell?
-
16-10-2019 - |
Вопрос
Я хочу создать сценарий PowerShell, который:
- Добавьте решение для фермы, которое содержит только шаблон сайта
- развернуть решение по всему миру
- Подождите, пока закончить работу, чтобы закончить
- Создайте коллекцию сайтов на основе шаблона сайта
Первые три шага работают, как и ожидалось. 4 -й нет. Я получаю следующую ошибку:
New-SPSite : File or arguments not valid for site template 'myTemplate#0'.
Parameter name: WebTemplate
At D:\SCRIPT\install.ps1:73 char:11
+ New-SPSite <<<< $url -OwnerAlias "$user" -Name "my site name" -Template mytemplate#0" -Language 1036
+ CategoryInfo : InvalidData: (Microsoft.Share...SPCmdletNewSite:SPCmdletNewSite) [New-SPSite], ArgumentException
+ FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletNewSite
Если я создаю коллекцию сайтов из центральной администрации, она работает отлично.
Я подозреваю, что где -то есть «кеш» доступных шаблонов, но не нашел ни источника, ни решения.
Вот мой полный сценарий:
Add-PSSnapin Microsoft.SharePoint.PowerShell
Start-SPAssignment -Global
function WaitForJobToFinish([string]$SolutionFileName)
{
$JobName = "*solution-deployment*$SolutionFileName*"
$job = Get-SPTimerJob | ?{ $_.Name -like $JobName }
if ($job -eq $null) { Write-Host 'Timer job not found' }
else {
$JobFullName = $job.Name
Write-Host -NoNewLine "Waiting to finish job $JobFullName"
while ((Get-SPTimerJob $JobFullName) -ne $null) {
Write-Host -NoNewLine .
Start-Sleep -Seconds 2
}
Write-Host "Finished waiting for job.."
}
}
$user = (get-item env:userdomain).Value +'\' + (get-item env:username).Value
$webapp = 'http://myvirtualhost'
$url = 'http://myvirtualhost/sites/mysite'
$solutionName = 'mytemplate.wsp'
Add-SPSolution -LiteralPath (get-item $solutionName).Fullname
Install-SPSolution -Identity $solutionName -GACDeployment
WaitForJobToFinish $solutionName
remove-spsite $url -Confirm:$false
iisreset /noforce # trying to recycle the cache without success
New-SPSite $url -OwnerAlias "$user" -Name "my site name" -Template "mytemplate#0" -Language 1036
Stop-SPAssignment -Global
Решение
Вы правы в отношении того, что PowerShell Caches много.
Вы можете обойти это, породив новые процессы, которые выполняют код
Например
$shell = Start-Process Powershell .\test.ps1 -PassThru -Verb runas
Постанет новый процесс, который будет запущен в качестве администратора (-вербан) и прослеживает процесс (-Passthru), дающий вам возможность отслеживать коды выхода и, если процесс завершился. Проверьте синтаксис Start-Process, используя
Get-Help Start-Process -full
Проверьте членов процесса, используя
$shell | Get-Member
Другие советы
Пожалуйста, найдите сценарий, который я использовал в следующем посте В конце раздела B:
$file = "D:\Rahul\RestoreWSPSiteTemplate.log"
start-transcript $file
trap { stop-transcript; break}
Remove-SPSite -Identity "http://DEST_SERVER_NAME:PORT_NO/sites/ExampleRestore"
New-SPSite "http:// DEST_SERVER_NAME:PORT_NO/sites/ExampleRestore" -OwnerAlias domain\rahul.vartak
Add-SPUserSolution -LiteralPath "D:\Rahul\ExampleTemplate.wsp" -Site "http:// DEST_SERVER_NAME:PORT_NO/sites/ExampleRestore"
Install-SPUserSolution –Identity ExampleTemplate.wsp -Site "http:// DEST_SERVER_NAME:PORT_NO/sites/ExampleRestore"
$x = Get-SPSite "http:// DEST_SERVER_NAME:PORT_NO/sites/ExampleRestore"
$y = $x.GetWebTemplates(1033) | Where{ $_.Title -eq "ExampleTemplate" }
[system.reflection.assembly]::LoadWithPartialName("Microsoft.Sharepoint")
$site= new-Object Microsoft.SharePoint.SPSite("http:// DEST_SERVER_NAME:PORT_NO/sites/ExampleRestore")
$site.OpenWeb().ApplyWebTemplate($y)
$site.Dispose()
stop-transcript
Примечание. Это предполагает, что вы находитесь на сервере назначения во время запуска сценария.
Я закончил, используя наследие stsadm -o createsite
. Анкет Гораздо проще, чтобы создавать процесс или PS-сеанс. На самом деле это чистое решение PowerShell, но оно работает