0

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など)であると考えます。ソリューションの追加とアクティブ化、サイトコレクションの作成など、スクリプトの他のすべての機能が機能します。

ヘルプや入力をいただければ幸いです。

ありがとうございました。

4

1 に答える 1

0

わかりました、自分で考えていなかったので、ここでちょっとばかげているように感じますが、これが原因です。私と同じ問題を抱えている他の人の助けになることを願っています.

ソリューションを追加し、Sharepoint でそのソリューションをアクティブ化する場合、ページに Web パーツを追加するなどしてこのソリューションにアクセスするには、最初にIIS をリセットする必要があります。そのため、テスト中に、Sharepoint アプリケーション サーバーの IIS をリセットするためのコードを追加しませんでした。コード ブロックでなぜそれが機能したかを説明できる唯一の理由は、テスト中に誤って IIS をリセットしてしまった可能性があるからです。そうでなければ説明できません。ばかげた間違いで、恥ずかしくて頭を垂れましたが、それでいいのです。

于 2012-11-09T17:31:41.973 に答える