SharePoint環境全体を構築し、ソリューションを追加し、特定のページにWebパーツを最初から実装できるようにするスクリプトを作成しています。(もちろん)Webパーツをページに追加する最後の数行を除いて、スクリプトのほぼ全体が機能します。これが本当に奇妙なことです。PowerShellコマンドラインでまったく同じコードを実行すると、毎回機能します。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 ???)。
ですから、これは私と同僚を完全に困惑させています。スクリプトウィンドウ内でコードブロックとして機能するのに、スクリプトとして実行すると実行されないのはなぜですか。私が受け取るエラーはこれです:
ページPages/WebpartTest.aspxにWebパーツポーリングを追加するとエラーが発生しました。エラー:「2」引数を指定して「ImportWebPart」を呼び出す際の例外:「このページのWebパーツまたはWebフォームコントロールは表示またはインポートできません。タイプは安全として登録されていません。」
スクリプトではなく、VS2010およびコードブロックで正常に実行されるという事実がなければ、これは構成の問題(構成内のsafeExecuteなど)であると考えます。ソリューションの追加とアクティブ化、サイトコレクションの作成など、スクリプトの他のすべての機能が機能します。
ヘルプや入力をいただければ幸いです。
ありがとうございました。