Come è possibile risolvere questo script?PowerShell - Enumerazione attraverso una raccolta e modifica della raccolta
Sì, sto cambiando la raccolta nel ciclo foreach e questo è il motivo di questo errore.
Si è verificato un errore durante l'enumerazione di una raccolta: la raccolta è stata modificata; l'operazione di enumerazione non può eseguire .. in C: \ Users \ utente \ Documenti \ PowerShell \ ChangeAllListsV2.ps1: 47 char: 20 + foreach < < < < (Lista $ a $ webLists) + CategoryInfo: InvalidOperation: (Microsoft .Share ... il + SPEnumerator: SPEnumerator) [], RuntimeException + FullyQualifiedErrorId: BadEnumeration
#Script change in all lists the required field property "testfield" to false
#Part 0 - Configuration
$urlWebApp = "http://dev.sharepoint.com"
$countFound = 0
$countList = 0
$countFoundAndChange = 0
#Part 1 - PreScript
$snapin = Get-PSSnapin | Where-Object {$_.Name -eq "Microsoft.SharePoint.Powershell"}
if ($snapin -eq $null)
{
Write-Host “Loading SharePoint Powershell”
Add-PSSnapin Microsoft.SharePoint.Powershell
}
#Part 2 - Script
$webApp = Get-SPWebApplication $urlWebApp
#$webApp | fl
$webAppSites = $webApp.sites
foreach($site in $webAppSites)
{
Write-Host "***********************************************************************"
Write-Host "Found site: " $site -foreground blue
$siteAllWebs = $site.AllWebs
foreach($web in $siteAllWebs)
{
Write-Host "Found web: " $web -foreground blue
#$web | fl
$webLists = $web.Lists
foreach($list in $webLists)
{
$countList ++
Write-Host "Found list: " $list -foreground blue
#Change list property
$field = $Null
$field = $list.Fields["testfield"]
if($field){
Write-Host "Field found: " $list -foreground green
#Write-Host "in web: " $web -foreground green
$countFound ++
try{
if($field.Required)
{
#######################################################
$field.Required = $False
$field.Update()
#######################################################
$field = $Null
Write-Host "Done!: Change list: " $list -foreground green
$countFoundAndChange ++
}else{
Write-Host "Already!: Change list: " $list -foreground green
}
}
catch{
$field = $Null
Write-Host "Error!: Change list: " $list -foreground red
Write-Host "in web: " $web -foreground red
$_
}
}
}
}
}
Write-Host "Found lists: " $countList
Write-Host "Found lists with column [testfield]: " $countFound
Write-Host "Change lists with column [testfield]: " $countFoundAndChange
Vuoi dire come $ webAppSites = $ webApp.sites? Copio ogni collezione e dopo questo uso il foreach – LaPhi
@LaPhi: No, non così. Quello di cui stai parlando è solo un compito, non una copia. Ho aggiornato la mia risposta per mostrare come viene copiata una matrice. – Gebb
Una copia profonda di un intero sito non è la migliore delle idee. Un ciclo regolare "per" è la strada da percorrere. – Servy