powershelllistviewsharepointsharepoint-2019splist

updating List views SharePoint PowerShell


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"

Where am I going wrong? Any suggestions would be much appreciated..


Solution

  • Use for loop instead of foreach, as inside foreach loop, it's not available to delete or update property:

           $web = $site.RootWeb
        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($k=0; $k -lt $list.Views.Count; $k++)
               {
                        $otherview= $list.Views[$k]
                        $otherview.JSLink  = $jSFile
                        $otherview.Update()
               }
            }
    
          
        }
     
        
        $web.Dispose()
    

    Here is a blog specify the same error message with the solution, please refer:

    Collection was modified; enumeration operation may not execute