使用 Powershell 调用 Graph Api 上传文件夹和文件

Using Powershell to call the Graph Api to upload Folders and Files

所以我正在编写这个脚本,它将允许我将文件夹和文件上传到 SharePoint 文档库。目前,我的本地计算机上有一个文件夹 (TEST),其中包含一些其他文件夹,其中包含文件。我可以毫无问题地将文件夹和文件上传到 SharePoint,但我很难将它们放入正确的文件结构中。下面我将在 SharePoint 站点中创建我需要的所有文件夹。我调用图表 API,它会在根目录下创建所有文件夹,但其中一些文件夹不属于根目录,而是存在于其他一些文件夹中。我知道我需要 更改 $CreateFolderURL,但我不确定如何跟踪哪个文件夹或文件属于哪个文件夹。基本上我想在 SharePoint 库中复制相同的本地子目录结构

$Files = Get-ChildItem "C:\Users\Mark\Documents\TestUpload" -Recurse
write-host $Files

AllFolders($Files)
   
function AllFolders($Files){
    $CreateFolderURL = "https://graph.microsoft.com/v1.0/drives/(DriveID)/items/root/children"

    foreach($file in $Files){
         
         #check if folder or file
       if (! $file.PSIsContainer)
        {
        write-host "File"
        
        }
        else{
        
            
            $uploadFolderRequestBody = @{
            name= "$file"
            folder = @{}
            "@microsoft.graph.conflictBehavior"= "rename"
            } | ConvertTo-Json
   

    
            Invoke-RestMethod -Headers $header -Method Post -Body $uploadFolderRequestBody -ContentType "application/json" -Uri $CreateFolderURL


        }
        
    }
}

这没有经过测试。这样做的目的似乎是创建子目录结构。

如果您使用的是 PowerShell 5.1 或更高版本,Get-ChildItem 可以指定一个 -Directory 开关以避免检查 PSIsContainer。关键是在设置$CreateFolderURL.

时将本地基目录路径替换成URL路径
AllFolders('C:\Users\Mark\Documents\TestUpload')
   
function AllFolders($BaseDirectory) {
    $Directories = Get-ChildItem -Path $BaseDirectory -Recurse -Directory

    foreach ($Directory in $Directories) {
        $CreateFolderURL = 'http://graph.microsoft.com/v1.0/drives/(DriveID)/items/root/' +
            $_.FullName.Replace($BaseDirectory,'').Replace('\','/')
        $uploadFolderRequestBody = @{
            name= "$file"
            folder = @{}
            "@microsoft.graph.conflictBehavior"= "rename"
        } | ConvertTo-Json

        Invoke-RestMethod -Headers $header -Method Post -Body $uploadFolderRequestBody `
            -ContentType "application/json" -Uri $CreateFolderURL
    }
}