Búsqueda de sitios web

SharePoint Online: Corrección "Se produjo un error al enumerar una colección: la colección no se ha inicializado. No se ha solicitado o la solicitud no se ha ejecutado. Es posible que deba solicitarse explícitamente" en PowerShell


Problema: Error en el script de PowerShell CSOM de SharePoint Online:
“Se produjo un error al enumerar una colección: la colección no se ha inicializado. No se ha solicitado o no se ha ejecutado la solicitud. Es posible que sea necesario solicitarlo explícitamente”

Causa principal: Error “Se produjo un error al enumerar una colección: la colección no se ha inicializado. No se ha solicitado o no se ha ejecutado la solicitud. Es posible que deba solicitarse explícitamente” que normalmente ocurre cuando intenta acceder a un objeto en una colección antes de que se haya inicializado o cargado. Cada colección debe cargarse explícitamente antes de acceder a sus miembros.

El script problemático:
Este script de PowerShell intenta obtener columnas de un tipo de contenido.


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#parameters
$SiteURL="https://crescent.sharepoint.com/sites/marketing"
$ContentTypeID="0x01002A7A908ACAB0054880702EE263AC762B"
 
#Get Credentials to connect
$Cred= Get-Credential
 
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
     
#Get content type
$ContentType = $Ctx.web.ContentTypes.GetById($ContentTypeID)
$Ctx.Load($ContentType)
$Ctx.ExecuteQuery()
 
If($ContentType -ne $Null)
{
    #Get columns from the content type
    ForEach($Field in $ContentType.Fields)
    {           
        Write-Host -f Green $Field.Title
    } 
}
else
{
    Write-host "Content Type '$ContentTypeName' doesn't exist!'" -f Yellow
}

Aquí, en el script anterior, intentamos obtener columnas de un tipo de contenido sin cargar explícitamente la colección de campos, por lo que termina con un error.
La colección no sido inicializado. No se ha solicitado o no se ha ejecutado la solicitud. Es posible que deba solicitarse explícitamente.
En la línea:24 char:13
+ ForEach($Field in $ContentType.Fields)
+ ~~~~~~
+ CategoryInfo : Operación detenida: (:) [], CollectionNotInitializedException
+ FullyQualifiedErrorId: Microsoft.SharePoint.Client.CollectionNotInitializedException

Solución:

Para resolver el error, debe asegurarse de que la colección se haya inicializado y cargado correctamente antes de intentar acceder a ella. Normalmente, esto se puede hacer llamando al método adecuado para cargar la colección antes de llamar al método ExecuteQuery en SharePoint Online.

Aquí está el script corregido, donde cargamos la colección $ContentType.Fields y resolvimos el problema.


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#parameters
$SiteURL="https://crescent.sharepoint.com/sites/marketing"
$ContentTypeID="0x01002A7A908ACAB0054880702EE263AC762B"
 
#Get Credentials to connect
$Cred= Get-Credential
 
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
     
#Get content type
$ContentType = $Ctx.web.ContentTypes.GetById($ContentTypeID)
$Ctx.Load($ContentType)
$Ctx.ExecuteQuery()
 
If($ContentType -ne $Null)
{
    #Get Columns from the content type
    $Ctx.Load($ContentType.Fields)
    $Ctx.ExecuteQuery()

    #Get columns from the content type
    ForEach($Field in $ContentType.Fields)
    {           
        Write-Host -f Green $Field.Title
    } 
}
else
{
    Write-host "Content Type '$ContentTypeName' doesn't exist!'" -f Yellow
}

De manera similar, en PnP PowerShell, debemos usar el cmdlet Get-PnPProperty para cargar una colección.


#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/PMO"
$ListName = "Projects"
$ContentTypeName ="Item"
 
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive
 
#Get the List content type
$ContentType = Get-PnPContentType -Identity $ContentTypeName -List $ListName
 
#Load the "Fields" collection to retrieve All Fields from the Content Type
$ContentTypeFields = Get-PnPProperty -ClientObject $ContentType -Property Fields

#Get Field Title, Internal Name and ID
$ContentTypeFields | Select Title, InternalName, ID

Al inicializar y cargar correctamente la colección antes de acceder a ella, puede evitar el error "Se produjo un error al enumerar una colección" y recuperar con éxito las propiedades asociadas con un objeto en SharePoint Online usando PowerShell.

Artículos relacionados