2012-04-04 11 views
0

これは、@ marek-grzenkowiczが非常に親切に取り組んできた別のものから始まるクエリです。(Part2)SharePoint 2010、Powershell - すべてのドキュメントライブラリをループし、ビューを作成してデフォルトとして設定します。

問題1)実行時にスクリプトがエラーを生成しています。列挙されているコレクションの要素を変更することはできません。これを回避する方法を教えてください。既存のビューは、「詳細」などの場合、名前とそこにすでにある場合、それはまだ

An error occurred while enumerating through a collection: Collection was modified; enumera tion operation may not execute.. At C:\Users\quickdev1\Documents\LoopThroughAl lLibrariesCreateView.ps1:7 char:10 
+ foreach <<<< ($list in $web.Lists) { 
    + CategoryInfo   : InvalidOperati  on: (Microsoft.Share...on+SPEnumerator:S  PEnumerator) [], RuntimeException 
    + FullyQualifiedErrorId : BadEnumeration 

号2)が起こっている問題を回避するために作られているの変更にもかかわらず、私がチェックするために、いくつかのロジックを入れたいですそのライブラリをスキップしますが、それを達成する方法がわかりません。

もし誰でも助けてくれれば素晴らしいと思います。

おかげで、

アシュリー

全スクリプト

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 

$siteURL = "http://sp14fdev01/" 
$site = Get-SPSite($siteURL) 

foreach($web in $site.AllWebs) { 
    foreach($list in $web.Lists) { 
    if($list.BaseType -eq "DocumentLibrary") { 
// the variables `$web` and `$list` already reference the objects you need 
     //$site = New-Object Microsoft.SharePoint.SPSite($SiteURL) ; 
     //$web = $site.OpenWeb($SiteURL); 

// new instance of the list is necessary to avoid the error "Collection was modified" 
     $newList = $web.Lists.item($list.ID); 

     $viewfields = New-Object System.Collections.Specialized.StringCollection 
     $viewfields.Add("DocIcon") 
     $viewfields.Add("LinkFilename") 
     $viewfields.Add("_UIVersionString") 
     $viewfields.Add("FileSizeDisplay") 
     $viewfields.Add("Created") 
     $viewfields.Add("Modified") 
     $viewfields.Add("Editor") 
     [void]$newList.Views.Add("Detailed", $viewfields, "", 100, $true, $true) 

     $newList.Update(); 

// setting the default view 
     $view=$newList.Views["Detailed"] 
     $view.DefaultView = $true 
     $view.Update() 
    } 
    } 

    $web.Dispose(); 
} 

$site.Dispose(); 

答えて

0

あなたは、あなたがオーバーループしているコレクションを変更しているので、foreachののforループinstadを使用する必要があります。このよう

foreach($web in $site.AllWebs) 
{ 
    $listCounter = $web.Lists.Count 

    for($i=0;$i -le $listCounter;$i++) 
    { 
     $list = $web.Lists[$i] 
     //etc.... 

    } 

} 
+0

こんにちはオレ、ありがとう。どこからスクリプトを続けるべきですか? ここから - if($ list.BaseType -eq "DocumentLibrary"){ //変数 '$ web'と' $ list'は既に必要なオブジェクトを参照しています ....? – AshFlaw

+0

正しい。私はあなたがすでにこれを解決したと思いますか? –

関連する問題