简体   繁体   中英

Unable to pass SharePoint (PnP) connection to PowerShell job because it's becoming deserialized?

I am trying to delete every file in a SharePoint list. My org has retention turned on so I can't just delete the entire list, but must remove every folder/file. My issue is around the connection itself when used with Start-Job .

It's painfully slow, so I wanted to spin up batches of 10+ jobs to delete simultaneously and reuse the connection, but there is an issue passing the connection as an argument because it becomes deserialized. I found this post with the exact same issue and no solution.

If I "workaround" it by connecting each Start-Job , I get throttled by SharePoint online.

function Empty-PnPFiles($SPSiteUrl, $RelativeURL)
{
    $connection = Connect-PnPOnline -URL $SPSiteUrl -UseWebLogin -ReturnConnection

    # Get All files in the folder
    $Files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType File

    # Delete all files in the Folder
    $n = 0
    $Jobs = @()
    ForEach ($File in $Files)
    {
        $n++
        Write-Host "Creating job to delete '$($File.ServerRelativeURL)'"

        #Delete File
        $Jobs += Start-Job -ArgumentList @($connection, $File) -ScriptBlock {
            $LocalConnection = $args[0]
            # $LocalConnection = Connect-PnPOnline -URL <My SP URL> -UseWebLogin -ReturnConnection
            $LocalFile = $args[1]

            Remove-PnPFile -ServerRelativeUrl $LocalFile.ServerRelativeURL -Connection $LocalConnection -Force -Recycle
        }

        # Do in batches. Every 10 Jobs, wait for completion
        if ($n % 10 -eq 0)
        {
            Write-Host "Waiting for batch $n ($($Files.Count)) to complete before next batch" -ForegroundColor Green
            $Jobs | Wait-Job | Receive-Job
            $Jobs = @()
        }
    }

    # If there are left over jobs, wait for them
    if ($Jobs)
    {
        $Jobs | Wait-Job | Receive-Job
    }
}

$SiteURL = "https://<MySiteCollection>.sharepoint.com/sites/<MySite>"
$ListName = "TempDelete"

Empty-PnPFiles -SPSiteUrL $SiteURL -RelativeURL "/TempDelete" # <My Folder to Delete all files>

The error I get is:

Cannot bind parameter 'Connection'. Cannot convert the "PnP.PowerShell.Commands.Base.PnPConnection" value of type "Deserialized.PnP.PowerShell.Commands.Base.PnPConnection" to type "PnP.PowerShell.Commands.Base.PnPConnection".

在此处输入图像描述

How can I pass the connection to the script block without the serialization error? Or is there a better way to bulk-delete files from SPO using PowerShell? I have to use PowerShell because it's the only tool available to me currently.

Use Invoke-Command instead of Start-Job

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM