You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell和Graph的Get-MgDriveItemContent下载OneDrive文件遇错求助

使用Graph模块下载OneDrive文件时出错求解决方案

我尝试用Graph模块下载OneDrive文件,但最后一步报错,已经没思路了,求各位帮忙解决。

错误提示:

Get-MgDriveItemContent: 无法将参数绑定到参数 'OutFile',因为该参数不接受目录作为值。

相关PowerShell代码:

Connect-MgGraph -Scopes "Directory.ReadWrite.All", "Sites.ReadWrite.All", "Files.ReadWrite.All"

# 导入CSV用户列表
$terminatedUsers = Import-Csv -Path "C:\Users\me\Desktop\OneDriveUsersBackup.csv"

foreach ($user in $terminatedUsers) {
    $userPrincipalName = $user.UserPrincipalName
    
    # 创建用户数据存储目录
    $userDirectory = "C:\TerminatedUsers\$userPrincipalName"
    New-Item -ItemType Directory -Path $userDirectory -Force

    # 获取用户信息
    $userObject = Get-MgUser -Filter "userPrincipalName eq '$userPrincipalName'"

    # 获取用户OneDrive默认驱动器
    $userOneDrive = Get-MgUserDefaultDrive -UserId $userObject.id

    $driveId = $userOneDrive.id
    #Get-MgUserDriveItemContent -UserId $userObject.id -DriveId $driveId -DriveItemId "root" -OutFile $userDirectory
    Get-MgDriveItemContent -DriveId $driveId -DriveItemId "root" -OutFile $userDirectory
}

问题分析与解决方案

错误原因

Get-MgDriveItemContent的-OutFile参数要求传入具体文件名,但你现在传的$userDirectory是文件夹路径,所以触发参数绑定错误。另外,这个命令本身是用来下载单个文件的,无法直接下载整个文件夹。

解决方法

要下载整个OneDrive根目录的内容,需要递归遍历所有文件和文件夹,逐个创建本地目录并下载文件。以下是修正后的代码:

Connect-MgGraph -Scopes "Directory.ReadWrite.All", "Sites.ReadWrite.All", "Files.ReadWrite.All"

# 导入CSV中的用户列表
$terminatedUsers = Import-Csv -Path "C:\Users\me\Desktop\OneDriveUsersBackup.csv"

# 定义递归下载函数,处理文件夹和文件
function Download-DriveItem {
    param(
        [string]$DriveId,
        [string]$DriveItemId,
        [string]$LocalPath
    )

    # 获取当前DriveItem下的所有子项
    $items = Get-MgDriveItemChildren -DriveId $DriveId -DriveItemId $DriveItemId

    foreach ($item in $items) {
        $itemLocalPath = Join-Path -Path $LocalPath -ChildPath $item.Name
        
        if ($item.Folder) {
            # 如果是文件夹,先创建本地对应目录
            New-Item -ItemType Directory -Path $itemLocalPath -Force | Out-Null
            # 递归处理子文件夹内容
            Download-DriveItem -DriveId $DriveId -DriveItemId $item.Id -LocalPath $itemLocalPath
        } else {
            # 如果是文件,直接下载到本地路径
            Get-MgDriveItemContent -DriveId $DriveId -DriveItemId $item.Id -OutFile $itemLocalPath
            Write-Host "已完成下载: $itemLocalPath"
        }
    }
}

foreach ($user in $terminatedUsers) {
    $userPrincipalName = $user.UserPrincipalName
    
    # 创建用户专属的本地存储目录
    $userDirectory = "C:\TerminatedUsers\$userPrincipalName"
    New-Item -ItemType Directory -Path $userDirectory -Force | Out-Null

    # 根据用户UPN获取用户对象
    $userObject = Get-MgUser -Filter "userPrincipalName eq '$userPrincipalName'"

    # 获取用户的OneDrive默认驱动器
    $userOneDrive = Get-MgUserDefaultDrive -UserId $userObject.id

    if ($userOneDrive) {
        Write-Host "开始下载 $userPrincipalName 的OneDrive内容..."
        # 调用递归函数下载根目录下的所有内容
        Download-DriveItem -DriveId $userOneDrive.Id -DriveItemId "root" -LocalPath $userDirectory
        Write-Host "$userPrincipalName 的OneDrive内容下载完成`n"
    } else {
        Write-Warning "未找到 $userPrincipalName 的OneDrive驱动器,跳过该用户`n"
    }
}

说明

  1. 新增的Download-DriveItem函数会递归遍历OneDrive的目录结构,在本地创建对应的文件夹,并逐个下载文件。
  2. 修正了原代码中直接将目录传给-OutFile的错误,确保每个文件都有对应的本地文件名。
  3. 增加了日志输出,方便跟踪下载进度。

内容的提问来源于stack exchange,提问作者SophisticatedBear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:13:27