Búsqueda de sitios web

SharePoint Online: ¿Cómo utilizar la consulta CAML en PowerShell?


Requisito: Usar consulta CAML con PowerShell en SharePoint Online.

CAML es un lenguaje de consulta basado en XML, que significa Collaborative Application Markup Language, y se utiliza para realizar consultas en elementos de listas y bibliotecas de SharePoint. Esta publicación le enseñará los conceptos básicos del uso de la consulta CAML en PowerShell. Le mostraremos cómo usar una consulta CAML para filtrar y ordenar datos de SharePoint y también le brindaremos algunos ejemplos para ayudarlo a comenzar.

Elementos y operadores de consulta CAML:

Estos son los elementos y operadores más utilizados en las consultas CAML:

Eq

Igual a

Neq

No igual a

Gt

Mas grande que

Geq

Mayor qué o igual a

Lt

Menos que

Leq

Menos que o igual a

Contains

Contiene

IsNull

Nulo

IsNotNull

No nulo

BeginsWith

Comienza con texto

In

Valor en cualquiera de los valores dados.

NotIn

Valor que no está en ninguno de los valores dados.

Includes

Igual que Eq: en las columnas de búsqueda de selección múltiple, verifica si los valores dados están presentes.

NotIncludes

Simplemente hace lo contrario a “Incluye” - Igual que No Eq en múltiples valores

OrderBy

Especifica el orden de clasificación

Where

Aplica filtro a los datos.

ViewFields

Campos para recuperar

RowLimit

Número de filas para recuperar

La consulta CAML utiliza el nombre interno de los campos. Por lo tanto, se decodificarán todos los caracteres en los nombres de los campos (por ejemplo, "Espacio" se reemplazará con "_x0020_", por lo que el nombre del campo "Nombre del proyecto" se reemplazará con "Proyecto_x0020_Name"). Puede leer más en Nombre para mostrar versus nombre interno en nombres de columnas de SharePoint

SharePoint Online: ejemplo de consulta CAML usando PowerShell

Aquí está la consulta CAML para recuperar elementos de la lista de SharePoint. Obtengamos todos los elementos de la lista de la lista "Proyectos", donde el campo "Nombre del proyecto" es igual a "Métricas de innovación".


#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"
 
#Set parameter values
$SiteURL="https://crescent.sharepoint.com/"
$ListName="Projects"
 
#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 the List
$List = $Ctx.Web.lists.GetByTitle($ListName)

#Define the CAML Query
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery
$Query.ViewXml = "@
<View>
    <Query>
        <Where>
            <Eq>
                <FieldRef Name='ProjectName' /><Value Type='Text'>Innovation Metrics</Value>
            </Eq>
        </Where>
    </Query>
</View>"

#Get All List Items matching the query
$ListItems = $List.GetItems($Query)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()

Write-host "Total Number of Items:"$ListItems.count

#Loop through each List Item
ForEach($Item in $ListItems)
{ 
    Write-host $Item.id
}

SharePoint Online: PnP PowerShell para obtener elementos de lista mediante CAML

Utilice el parámetro "Consulta" para aplicar la consulta CAML en el cmdlet PnP PowerShell Get-PnPListItem


#Config Variables
$SiteURL = "https://Crescent.sharepoint.com"
$ListName = "Project Tasks"
 
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
 
#CAML Query to Filter List Items
$Query = "<View><Query><Where><Eq><FieldRef Name='ProjectStatus' /><Value Type='Choice'>Completed</Value></Eq></Where></Query></View>"
 
#Get All List Items matching given query
$ListItems = Get-PnPListItem -List $ListName -Query $Query
 
#Loop through each Item
Write-host -f Green "Number of List Items Found:"$ListItems.Count
ForEach($ListItem in $ListItems)
{  
    Write-Host "Id :" $ListItem["ID"] 
    Write-Host "Title :" $ListItem["Title"]
}

Consulta CAML en SharePoint Online para ordenar en orden ascendente o descendente

Aquí está el CSOM CAML Query PowerShell para ordenar los resultados.


#Set parameter values
$SiteURL="https://crescent.sharepoint.com/"
$ListName="Projects"
 
#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 the List
$List = $Ctx.Web.lists.GetByTitle($ListName)

#Define the CAML Query
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery
$Query.ViewXml = "@
<View>
    <Query> 
        <OrderBy><FieldRef Name='Title' /></OrderBy> 
    </Query> 
</View>"

#Get All List Items matching the query
$ListItems = $List.GetItems($Query)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()

Write-host "Total Number of Items:"$ListItems.count

#Loop through each List Item
ForEach($Item in $ListItems)
{ 
    #Do Something
    Write-host $Item.id
    Write-host $Item["Title"]
}  

Para ordenar en orden descendente:


<OrderBy><FieldRef Name='Title' Ascending='FALSE' /></OrderBy>

Operadores mayores que, mayores o iguales que, menores que, menores o iguales que en el campo Moneda:
Obtengamos todos los elementos donde el valor de “Inversión total” sea mayor o igual a 5000


<View>
    <Query>
        <Where>
            <Geq>
                <FieldRef Name='TotalInvestment' /><Value Type='Currency'>5000</Value>
            </Geq>
        </Where>
    </Query>
</View>

Combinación de múltiples operadores AND y OR en la consulta CAML de PowerShell:
Combinemos múltiples operadores AND y OR para obtener todos los proyectos con un valor de "Inversión total" entre 5000 y 10000, y el departamento de proyectos es ya sea “Ventas” o “Marketing”.


<View>
    <Query>
        <Where>
            <And>
                <And>
                    <Geq>
                        <FieldRef Name='TotalInvestment' /><Value Type='Currency'>5000</Value>
                    </Geq>
                    <Leq>
                        <FieldRef Name='TotalInvestment' /><Value Type='Currency'>10000</Value>
                    </Leq>
                </And>
                <Or>
                    <Eq>
                        <FieldRef Name='ProjectDepartment' /><Value Type='Choice'>Sales</Value>
                    </Eq>
                    <Eq>
                        <FieldRef Name='ProjectDepartment' /><Value Type='Choice'>Marketing</Value>
                    </Eq>
                </Or>
            </And>
        </Where> 
    </Query>
</View>"

La validación comienza de arriba a abajo cuando tiene varios operadores "Y" en la consulta CAML.

Consulta CAML de SharePoint Online en PowerShell: el operador "IN"
El operador "In" reemplaza varias condiciones "OR". Valida si los elementos están en alguno de los valores dados (igual que el operador "in" de SQL Server). Aquí hay un ejemplo para el operador "IN" en la consulta CAML: esto obtiene todos los elementos de la lista donde el valor de la columna "Nombre del proyecto" está en cualquiera de las opciones enumeradas en el operador In:


<View>
    <Query>
        <Where>
            <In>
                <FieldRef Name='ProjectName' />
                <Values>
                    <Value Type='Text'>Address Book</Value>
                    <Value Type='Text'>Announcements</Value>
                    <Value Type='Text'>Birthday</Value>
                    <Value Type='Text'>Invitation</Value>
                </Values>
            </In>
        </Where>
    </Query>
</View>

Obtener elementos de la lista donde un archivo de texto contiene un valor particular:
Obtengamos todos los elementos de la lista donde el nombre del proyecto contiene texto "Inv", como "Factura", "Factura anual", " Inv Mensual”, etc.


<View>
    <Query>
        <Where>
            <Contains>
                <FieldRef Name='ProjectName' /><Value Type='Text'>Inv</Value>
            </Contains>
        </Where>
    </Query>
</View>

Ejemplo de consulta CAML para obtener todos los elementos de la lista donde un campo particular no es nulo:
Obtengamos todos los proyectos donde la descripción del proyecto tiene algún valor (no nulo)


<View>
    <Query>
        <Where>
            <IsNotNull><FieldRef Name='ProjectDescription' /></IsNotNull>
        </Where>
    </Query>
</View>

CAML Consulta ViewFields en PowerShell
El nodo "ViewFields" en CAML define qué campos se recuperarán de la lista. Por ejemplo, desea obtener solo los campos "Nombre del proyecto", "Departamento" y "Ciudad" de la lista.


<View>
    <ViewFields>
        <FieldRef Name='ProjectName'/>
        <FieldRef Name='Department' />
        <FieldRef Name='City' />
    </ViewFields> 
</View>"

Ver alcance en la consulta CAML de SharePoint Online

De forma predeterminada (si no especifica nada para el parámetro de alcance), todos los archivos y carpetas en la carpeta raíz de la lista o biblioteca se consideran alcance.

Obtenga todos los archivos y carpetas en todos los niveles en profundidad


<View Scope='RecursiveAll'>  
</View>

Obtener todos los archivos de la carpeta raíz:


<View>  
      <Query> 
            <Where>
                 <Eq>
                     <FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value>
                </Eq>
           </Where> 
       </Query> 
</View>

Obtener todas las carpetas de la carpeta raíz de la lista:


<FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value>

Obtener todos los archivos de todas las carpetas de la lista:


<View Scope='RecursiveAll'>  
            <Query> 
               <Where>
                     <Eq>
                           <FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value>
                     </Eq>
               </Where> 
            </Query> 
</View>

Consulta CAML de SharePoint Online para obtener todas las carpetas de todas las carpetas de la lista:


<View Scope='RecursiveAll'>  
            <Query> 
               <Where>
                     <Eq>
                           <FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value>
                     </Eq>
               </Where> 
            </Query> 
</View>

Obtener todos los elementos de una subcarpeta específica de la lista:

Consulte: SharePoint Online: obtenga todos los elementos de la lista de una subcarpeta usando PowerShell

Herramienta de creación de consultas CAML de SharePoint

Hay herramientas disponibles para generar consultas CAML. Mis creadores de consultas CAML favoritos para SharePoint Online son U2U CAML Query Builder y CAML Designer, que funcionan con SharePoint local y SharePoint Online.

Errores y soluciones comunes:
Error: “Uno o más tipos de campos no están instalados correctamente. Vaya a la página de configuración de la lista para eliminar estos campos”.

Solución: ¡Los campos se refieren en la consulta CAML por su nombre interno! Asegúrese de que los nombres de los campos referidos sean válidos.

Error: no se puede completar esta acción

Solución: ¡La consulta CAML no está bien formada! Por ejemplo, es posible que tenga una etiqueta sin el cierre “”.

Artículos relacionados