Получить список с 5000 предметов на сайте Коллекции - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь получить весь список в коллекциях сайтов.

Сценарий ниже просто получает список в определенном семействе сайтов, и это работает правильно.

   #environment variables 
   $username = "user.name@xxx.com"
   $password = Read-Host -Prompt "Enter your password: " -AsSecureString
   $url = "https://xxx.sharepoint.com/sites/xxxxxx"

   $securePassword = ConvertTo-SecureString $password -AsPlainText -Force 

   #add SharePoint Online DLL - update the location if required
   $programFiles = [environment]::getfolderpath("programfiles")
   add-type -Path $programFiles'\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll'  

   # connect/authenticate to SharePoint Online and get ClientContext object.. 
   $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($url) 
   $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword) 
   $ctx.Credentials = $credentials 

   #get all the sub webs
   $Web = $ctx.Web  
   $ctx.Load($web)  
   $ctx.Load($web.Webs)    
   $ctx.executeQuery()

   Write-Host -ForegroundColor Yellow "There are:" $web.Webs.Count "sub webs in this site collection"

   #get all the lists 
   foreach ($subweb in $web.Webs)
   {
       $lists = $subweb.Lists
       $ctx.Load($lists)
       $ctx.ExecuteQuery()


       #output the list details
       Foreach ($list in $lists)
    {
    if ($list.ItemCount -gt 5000)
           { 
    Write-Host -ForegroundColor Yellow "The site URL is" $subweb.Url
    Write-Host "List title is: " $list.Title". This list has: " $list.ItemCount " items"
           }


    }
   }

Когда я пытаюсь изменить его, чтобы получить списки во всем семействе сайтов. Это ошибка. Вот скрипт, который я модифицирую.

   #environment variables 
   $username = "user.name@xxxx.com"
   $password = Read-Host -Prompt "Enter your password: " -AsSecureString
   $url = get-content "C:\Users\user.name\Documents\PowershellScripts\sites.txt"

   $securePassword = ConvertTo-SecureString $password -AsPlainText -Force 

   #add SharePoint Online DLL - update the location if required
   $programFiles = [environment]::getfolderpath("programfiles")
   add-type -Path $programFiles'\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll'  

   # connect/authenticate to SharePoint Online and get ClientContext object.. 
   $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($url) 
   $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword) 
   $ctx.Credentials = $credentials 

   #get all the sub webs
   $Web = $ctx.Web  
   $ctx.Load($web)  
   $ctx.Load($web.Webs)    
   $ctx.executeQuery()


   foreach($urls in $url)
   {
   Write-Host -ForegroundColor Yellow "There are:" $web.Webs.Count "sub webs in this site collection"
   #get all the lists 
   foreach ($subweb in $web.Webs)
   {
       $lists = $subweb.Lists
       $ctx.Load($lists)
       $ctx.ExecuteQuery()

       #output the list details
       Foreach ($list in $lists)
    {
    if ($list.ItemCount -gt 5000)
           { 
    Write-Host -ForegroundColor Yellow "The site URL is" $subweb.Url
    Write-Host "List title is: " $list.Title". This list has: " $list.ItemCount " items"
           }


        }
   }
   }

Это ошибка.

Вы не можете вызвать метод для выражения с нулевым значением. В C: \ Users \ joshua.maniquiz \ Documents \ PowershellScripts \ GetAllSubWebsandListswithItemCounts.ps1: 22 char: 1 + $ ctx.executeQuery () + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull В этом семействе сайтов есть 0 под-сетей. являются: 0 вложенных веб-страниц в этом семействе сайтов. семейство сайтов В этом семействе сайтов есть 0 под-сетей. являются: 0 вложенных веб-страниц в этом семействе сайтов

Заранее благодарю за помощь!

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Я немного переписал ваш сценарий, используя командлеты SharePoint PnP PowerShell , чтобы сделать то же самое. Я думаю, что я реализовал то, что вы пытаетесь сделать:)

$urls = Get-Content "C:\Users\user.name\Documents\PowershellScripts\sites.txt"

$username = "user.name@xxxx.com"
$encpassword = Read-Host -Prompt "Enter your password: " -AsSecureString

$cred = New-Object -typename System.Management.Automation.PSCredential -argumentlist $username, $encpassword

foreach($url in $urls) {
    Connect-PnPOnline -Url $url -Credentials $cred

    $rootweb = Get-PnPWeb -Includes Webs

    foreach($web in $rootweb.Webs) {
        $currentWeb = Get-PnPWeb $web.Id -Includes Lists

        foreach($list in $currentWeb.Lists) {
            if ($list.ItemCount -gt 5000) { 
                Write-Host -ForegroundColor Yellow "The site URL is" $currentWeb.Url
                Write-Host "List title is: " $list.Title". This list has: " $list.ItemCount " items"
           }
        }
    }
}

Прежде чем вы сможете запустить вышеуказанный сценарий, вам также необходимо установить командлеты SharePoint PnP, что можно сделать, запустив

Install-Module SharePointPnPPowerShellOnline

, если вы используете Windows 10. В других случаях см. на этой странице для получения дополнительной информации.

С помощью приведенного выше кода я хочу проиллюстрировать, как вы можете написать ту же вещь короче, используя более высокоуровневые командлеты.

Командлеты SharePoint PnP PowerShell - это командлеты, созданные сообществом SharePoint PnP и распространяемые бесплатно.

0 голосов
/ 04 мая 2018

Ваше смешивание единственного / множественного числа с $url и $urls в лучшем случае неудачно.

Если ваши учетные данные совпадают для всех сайтов и объект $ctx не нужно выгружать / освобождать, это может сработать.

#environment variables 
$username = "user.name@xxx.com"
$password = Read-Host -Prompt "Enter your password: " -AsSecureString
$sites = get-content "C:\Users\user.name\Documents\PowershellScripts\sites.txt"

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force 

#add SharePoint Online DLL - update the location if required
$programFiles = [environment]::getfolderpath("programfiles")
add-type -Path $programFiles'\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll'  

ForEach($site in $sites) {
    # connect/authenticate to SharePoint Online and get ClientContext object.. 
    $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($site) 
    $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword) 
    $ctx.Credentials = $credentials 

    #get all the sub webs
    $Web = $ctx.Web  
    $ctx.Load($web)  
    $ctx.Load($web.Webs)    
    $ctx.executeQuery()

    Write-Host -ForegroundColor Yellow "There are:" $web.Webs.Count "sub webs in this site collection"
    #get all the lists 
    ForEach ($subweb in $web.Webs) {
        $lists = $subweb.Lists
        $ctx.Load($lists)
        $ctx.ExecuteQuery()

        #output the list details
        ForEach ($list in $lists) {
            if ($list.ItemCount -gt 5000) { 
                Write-Host -ForegroundColor Yellow "The site URL is" $subweb.Url
                Write-Host "List title is: " $list.Title". This list has: " $list.ItemCount " items"
            }
        }
    }
}
...