Как можно исправить этот скрипт?PowerShell - Перечисление через коллекцию и изменение коллекции
Да, я меняю коллекцию в цикле foreach, и это является причиной этой ошибки.
Произошла ошибка при перечислении через коллекцию: коллекция была изменена; операции перечисления не может выполнить .. В C: \ Users \ пользователь \ Documents \ PowerShell \ ChangeAllListsV2.ps1: 47 полукокса: 20 + Еогеасп < < < < ($ список в $ webLists) + CategoryInfo: InvalidOperation: (Microsoft .Share ... на + 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
Вы имеете в виду $ webAppSites = $ webApp.sites? Я копирую каждую коллекцию, и после этого я использую foreach – LaPhi
@LaPhi: Нет, не так. То, о чем вы говорите, это просто задание, а не копирование. Я обновил свой ответ, чтобы показать, как копируется массив. – Gebb
Глубокая копия всего сайта - не лучшая идея. Правильный цикл «за» - это путь. – Servy