PowerShell - Aufzählung durch eine Sammlung und ändern Sie die Kollektion
Wie es ist posible, um dieses Update-script?
Ja, ich bin die änderung der Auflistung in der foreach-Schleife und das ist der Grund für diesen Fehler.
Fehler beim aufzählen über eine Auflistung: die Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt werden..
Bei C:\Users\user\Documents\PowerShell\ChangeAllListsV2.ps1:47 char:20
+ foreach <<<< ($list in $webLists)
+ CategoryInfo : InvalidOperation: (Microsoft.Teilen...in+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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
SPListCollection
neigt zum ändern der collection, wenn die Aktualisierung Ihrer Eigenschaften (Felder, event Receiver, etc.). Sie können verwenden Sie eine for-Schleife statt:Können Sie versuchen, kopieren Sie die Kollektion, die Sie gerade Durchlaufen haben, auf eine andere Auflistung (ein array oder eine Liste) und dann die Iteration auf, die neue Sammlung.
Etwas wie dieses:
Den obigen code gibt die folgende Ausgabe:
Beachten Sie, dass die
$copy
variable bezieht sich auf eine andere Sammlung.Check: http://soreddymanjunath.blogspot.in/2014/07/collection-was-modified-enumeration.html
Hier ist anonther Beispiel für das gleiche Problem
zum ersten mal wird die Schleife Durchlaufen foreach entfernen unterstützt Kultur für die erste Zeit, wenn es um die Schleife für die zweite iteration wird es dann wirfst du die exception "die Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt werden",
Lösung zu Oben genannten problem zu Speichern, um die Werte geändert, die in einer Arraylist, und versuchen Sie zu ändern, die das problem lösen wird, bin ich Hier die Speicherung von Arraylist aufgerufen enumcul und einfügen von Werten in es und ändern es...