当前位置: 首页 > news >正文

如何在Azure Pipeline中使用PowerShell从OneDrive for Business下载指定文件

最近在配置AzureDevOps Pipeline的时候需要在执行任务之前下载一个cli工具,但是由于工具的下载服务器速度不稳定,有时候会造成Pipeline执行速度过慢导致整个流水线超时,
这时我想到可以把文件上传到OneDrive for Business,这样当在同一个区域访问的时候,因为都在Azure的相同Region,可以直接通过内网下载文件,确保了访问速度。
但是接下来的问题是Azure Pipeline没有直接提供从OneDrive for Business获取文件的工具,通过查看Github文档内Microsoft hosted agent的定义文件:
Ubuntu2404-Readme.md
我发现系统默认安装了:PowerShell,Microsoft.Graph,于是我想到可以使用PowerShell的Microsoft.Graph模块来下载文件。
根据文档,Microsoft.Graph需要先登录,登录方式支持多种方式,适合Pipeline使用的是证书验证或客户端密钥验证,我选择使用客户端密钥验证。
无论使用证书验证还是客户端密钥验证都需要在Microsoft Entra ID里面先注册应用,并设置访问Microsoft Graph API访问的应用权限。
在设置权限并生成了客户端密钥后,就可以通过Microsoft.Graph模块访问OneDrive for Business数据。以下是登录的PowerShell脚本:
Import-Module Microsoft.Graph.Authentication
Import-Module Microsoft.Graph.Files
Write-Host "Microsoft.Graph modules imported."
$SecureSecret = ConvertTo-SecureString -String $(ClientSecret) -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $(ClientId), $SecureSecret
Write-Host "Connecting Microsoft.Graph"
Connect-MgGraph -TenantId $(TenantId) -ClientSecretCredential $Credential -NoWelcome
登陆完成后可以继续获取数据,脚本如下:
$Drive = Get-MgUserDefaultDrive -UserId $(User)
$DriveItem = Get-MgDriveItem -DriveId $Drive.Id -DriveItemId $(ItemPath)
注意,在获取完Drive信息后,本来是可以直接使用Get-MgDriveItemContent
Get-MgDriveItemContent -DriveId <string> -DriveItemId <string> -OutFile <string>
下载文件到指定目录,但是这个命令在Linux发行版里面有Bug,详见Github issue: Get-MgDriveItemContent_Get: Cannot set percent because PercentComplete cannot be greater than 100. (Parameter 'value') Actual value was 2147483647. #3105
所以我不得不使用先通过Get-MgDriveItem获取下载链接再使用Invoke-WebRequest下载文件的方式完成。
这里面有个坑,按照文档和示例,
获取Item可以使用ItemID或Item的路径,但对于路径的规则设定,文档里没有明确给出示例,比如我把文件A.txt放在根目录下,那么我会认为路径就是"/A.txt"或"A.txt",但很可惜,这两种路径调用都会直接返回400错误,
说明路径的格式不正确,后来我注意到文档的Http示例里面有一个这样的请求URL:
GET /drives/{drive-id}/root:/{item-path}
于是我想到,需要在path前面加上/root:/变成/root:/A.txt才是正确的路径格式。
获取到DriveItem后,需要提取下载地址,这里会遇到第二个坑,根据文档
获取到的DriveItem内有一个
@microsoft.graph.downloadUrl
可以获取到一个不需要身份验证就能下载文件的临时地址,但如果在PowerShell里面直接访问这个属性会返回空结果,文档里关于返回的driveItem的数据结构说明也很明确应该直接通过对象访问属性:
DriveItem JSON representation
文档看完以后就更迷糊到底这个属性在哪里?
原来由于'@microsoft.graph.downloadUrl'的命名方式由于不满足C#的属性命名规则,于是DriveItem里面设置了一个AdditionalProperties,以Key-Value的形式保存了这个属性,很奇怪的是这一点在PowerShell的文档示例里面完全没有提到。
知道了这一点获取这个属性就很容易了。
$DownloadUrl = $DriveItem.AdditionalProperties['@microsoft.graph.downloadUrl']
Invoke-WebRequest -Uri $DownloadUrl -OutFile $(DownloadPath)
Disconnect-MgGraph
折腾了半天,终于搞定了在Azure Pipeline的Linux agent下通过PowerShell下载OneDrive for Business文件的任务。
这里的坑主要在于文档示例语焉不详和一个陈年bug一直不修,只有踩完一遍坑才能完成这个看起来很简单的需求。

http://www.jsqmd.com/news/299114/

相关文章:

  • YOLOv26自行车部件检测识别系统实现
  • 35.LRU 缓存
  • 初学者使用 docker 快速体验 TDengine 功能
  • 【LeetCode】四数之和 - 指南
  • 我在哪儿-- 照片定位查看助手
  • 2026年企业AI获客必看:GEO服务商选型权威指南
  • LoRA微调target module设置
  • Claude Skills 保姆级教程:无脑照做就能用出效果
  • 人工智能之核心技术 深度学习 第一章 神经网络基础
  • 慢充3.3kW占20%,普通7kW占50%,快充11kW占20%,超充20kW占10
  • 2026年青少年心理辅导优选名单,口碑机构来助力,家庭教育指导/叛逆孩子教育/青少年心理咨询,青少年心理辅导学校排名
  • 完整教程:目前流行的前端框架
  • 电力市场出清程序。 IEEE14节点考虑输电阻塞,求解机组边际电价和节点边际电价。 采用拉格朗...
  • 单北斗GNSS在桥梁和地质灾害变形监测中的应用与发展
  • 【LeetCode】91. 解码方法 - 教程
  • 2026 主流GEO服务商全景图谱,企业GEO服务商选型指南
  • 三相与两相步进方案的矢量控制及超前角控制:内置微控制器的技术解析
  • 光伏储能交直流微电网matlab/simulink仿真,风光储能联合发电系统simulink仿...
  • 双亲表示法构造树-----Java实现
  • KiCad V10新特性前瞻
  • 电气设计的隐藏外挂:1:1元器件图库实战
  • 基于传统材料力学势能法的健康齿轮时变啮合刚度数值分析
  • Product Hunt 每日热榜 | 2026-01-25
  • 构建 OpenHarmony 跨设备任务协同中心:Flutter 实现多端任务流转与状态同步
  • 构建 OpenHarmony 智能场景自动化配置面板:Flutter 实现可视化规则编排
  • Simulink双Y-30度六相感应电机模型,matlab18B版本。 六相交流供电
  • 强烈安利8个一键生成论文工具,继续教育学生论文写作必备!
  • ubuntu_server安装教程
  • 基于深度学习的 pcb 缺陷检测系统
  • 基于单片机的汽车倒车雷达超声波测距系统设计