0

これは、@marek-grzenkowicz が非常に親切に取り組んでくれた別のクエリから派生したクエリです。

問題 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();
4

1 に答える 1

0

ループしているコレクションを変更しているため、foreach の代わりに for ループを使用する必要があります。

このような:

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

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

    }

}
于 2012-05-14T19:45:39.797 に答える