updating List views SharePoint PowerShell

DevP 21 Reputation points
2021-04-13T20:18:20.847+00:00

I want to be able to update the "JSLink" property on all views in two different lists. However I keep getting the following error:

"Collection was modified; enumeration operation may not execute."

I have the following PowerShell:

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue


#Temp Site
$siteColl = "mysitecollectionURL"

$site = Get-SPSite $siteColl

#JS file to add
$jSFile = "clienttemplates.js"

#Lists to update
$masterTasks = "Master Tasks"
$allTasks = "All Tasks"


        Write-Host "`nChecking site:" $site.RootWeb.URL

        #Get root web
        $web = $site.RootWeb

        #Iterating lists
        foreach($list in $web.Lists)
        {   
            if($list.Title -eq $masterTasks)
            {
                write-host "`n`tMaster Tasks list found"

                #Iterating views
                foreach($view in $list.Views)
                {
                        $view.JSLink = $jSFile
                        $view.Update()
                }
            }

            if($list.Title -eq $allTasks)
            {
                write-host "`n`tAll Tasks list found"

                #Iterating views
                foreach($view in $list.Views)
                {
                        $view.JSLink = $jSFile
                        $view.Update()
                }
            }
        }
        $web.Dispose()


Write-Host "`n"
SharePoint Server Development
SharePoint Server Development
SharePoint Server: A family of Microsoft on-premises document management and storage systems.Development: The process of researching, productizing, and refining new or existing technologies.
1,576 questions
0 comments No comments
{count} votes

Accepted answer
  1. MichaelHan-MSFT 18,016 Reputation points
    2021-04-14T08:01:59.057+00:00

    Hi @DevP ,

    It's not supported to use add/delete/update method inside foreach loop, otherwise you would get this error.

    You need to use for loop instead to achieve this:

      For($i=0; $i -lt $web.Lists.count; $i++)  
        {  
           if($web.Lists[$i].Title  -eq $masterTasks)  
           {  
                 write-host "`n`tMaster Tasks list found"  
      
               For($j=0; $j -lt $list.Views.Count; $j++)  
               {  
                        $view=$list.Views[$j]  
                        $view.JSLink  = $jSFile  
                        $view.Update()  
               }  
           }  
      
           if($web.Lists[$i].Title  -eq $allTasks)  
            {  
                write-host "`n`tAll Tasks list found"  
          
                #Iterating views  
          
               For($j=0; $j -lt $list.Views.Count; $j++)  
               {  
                        $view= $list.Views[$k]  
                        $view.JSLink  = $jSFile  
                        $view.Update()  
               }  
            }       
        }  
    

    If an Answer is helpful, please click "Accept Answer" and upvote it.
    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

    1 person found this answer helpful.

0 additional answers

Sort by: Most helpful