我正在编写一个脚本,它允许我们构建整个 SharePoint 环境、添加解决方案并从头开始在特定页面上实施 Web 部件。除了最后几行将 Web 部件添加到页面(当然)之外,几乎整个脚本都可以工作。这是真正奇怪的事情。如果我在 power-shell 命令行中运行完全相同的代码,它每次都可以工作。将 Web 部件添加到页面的脚本是从一个单独的 ps1 文件调用的,该文件传递脚本运行所需的信息。这是代码:
function addWebPartToPage($siteURL, $pageURL, $webpartName, $listName, $solutionName, $destinationZone, $zoneIndex)
{
$web = Get-SPWeb $siteURL
$file = $web.GetFile($pageURL)
if($file.Exists)
{
try
{
checkOutPage($file)
$list = $web.Lists[$listName]
$wpManager = $web.GetLimitedWebPartManager($web.Url + $pageURL,[System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared);
$webPartListItem = $list.Items | where {$_.Title -eq $solutionName}
$xmlReader = New-Object System.Xml.XmlTextReader($webPartListItem.File.OpenBinaryStream());
$errorMsg = ""
#breaks here:
$webPart = $wpManager.ImportWebPart($xmlReader, [ref]$errorMsg)
$wpManager.AddWebPart($webpart,"$destinationZone",$zoneIndex)
}
catch
{
$ErrorMessage = $_.Exception.Message
$returnVal = 1
}
finally
{
checkInPage($file)
$pweb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
$page = $pweb.GetPublishingPage($pageURL)
approvePage $page
#close the xml reader
if($xmlReader -ne $null)
{
$xmlReader.Close()
}
$wpManager.Dispose()
$web.Dispose()
[GC]::Collect()
checkIfFailed $returnVal
}
}
}
为了证明代码确实有效,我打开了一个具有管理员权限的新 PowerShell 窗口(请注意,调用脚本本身的窗口也使用管理员权限)并将上述变量设置为将传入的值。然后我复制并将我的代码块粘贴到窗口中并成功运行(WAT???)。
所以这让我自己和一位同事完全被难住了。为什么它在脚本窗口中作为代码块工作,但在我作为脚本执行时不会运行。我收到的错误是这样的:
将 webpart Poll 添加到页面 Pages/WebpartTest.aspx 时出错。错误:使用“2”参数调用“ImportWebPart”的异常:“无法显示或导入此页面上的 Web 部件或 Web 窗体控件。该类型未注册为安全类型。”
如果不是因为它通过 VS2010 和代码块而不是脚本成功运行,我会认为这是一个配置问题(配置中的 safeExecute 等)。我的脚本的所有其他功能都有效,包括添加和激活解决方案、创建网站集等。
任何帮助或输入将不胜感激。
谢谢你。