使用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" } }
说明
- 新增的
Download-DriveItem函数会递归遍历OneDrive的目录结构,在本地创建对应的文件夹,并逐个下载文件。 - 修正了原代码中直接将目录传给
-OutFile的错误,确保每个文件都有对应的本地文件名。 - 增加了日志输出,方便跟踪下载进度。
内容的提问来源于stack exchange,提问作者SophisticatedBear
相关产品推荐
相关产品推荐

