[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell如何获取onedrive网盘上的文件列表?

有人知道如何获取自己在onedrive网盘上的文件列表吗? 感觉是可以实现的, 因为Alist就可以列出网盘里的文件, 问了gpt回复如下, 貌似有点复杂, 有大神给提点一下吗? 感谢
  1. # 安装 MSAL.PS 模块
  2. Install-Module -Name MSAL.PS -Force
  3. # Azure AD 应用的设置
  4. $clientId = "<你的应用程序ID>"
  5. $tenantId = "<你的租户ID>"
  6. $scope = "https://graph.microsoft.com/.default"
  7. $authority = "https://login.microsoftonline.com/$tenantId"
  8. # 获取访问令牌
  9. $tokenResponse = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes $scope -Authority $authority -Interactive
  10. # 访问令牌
  11. $accessToken = $tokenResponse.AccessToken
  12. # 调用 Microsoft Graph API 获取 OneDrive 根目录的文件列表
  13. $uri = "https://graph.microsoft.com/v1.0/me/drive/root/children"
  14. # 使用访问令牌请求 OneDrive 文件列表
  15. $response = Invoke-RestMethod -Uri $uri -Headers @{Authorization = "Bearer $accessToken"} -Method Get
  16. # 输出文件信息
  17. $response.value | ForEach-Object {
  18.     Write-Host "文件名: $($_.name)"
  19.     Write-Host "类型: $($_.file.mimeType)"
  20.     Write-Host "大小: $($_.size) bytes"
  21.     Write-Host "---------------------------------"
  22. }
复制代码

以前写过,整理了下
https://went-cloud.oss-cn-beijin ... 1/onedrive_list.ps1
首次使用需要登录
1

评分人数

TOP

本帖最后由 小白龙 于 2024-9-3 10:55 编辑

回复 2# went


    多谢大佬分享, 刚试了一下, 我已经将下面两个变量的值设为了我的az应用的值, 但执行后会报下面的错误, 而且代码在ISE中执行后, 就停止不了了, 只能重启ISE
$clientID = 'xxx'
$clientSecret = 'xxx'
--------------------------------------------------------------
我们无法完成你的请求
unauthorized_client: The client does not exist or is not enabled for consumers. If you are the application developer, configure a new application through the App Registrations in the Azure Portal at https://go.microsoft.com/fwlink/?linkid=2083908.

TOP

本帖最后由 小白龙 于 2024-9-3 11:00 编辑

回复 2# went


    另外有个模块, 是专门处理认证的, 估计应该会简单一些, 但怎么改呢
Import-Module MSAL.PS

-------------------------------------------------------------------------------------------
另外, 我估计有可能我的az应用设置可能有问题, 能指导一下要设哪几个项吗?
我是按下面的链接的教程设置的
https://cknotes.com/oauth2-clien ... e-app-registration/

TOP

回复 2# went


    用下面链接的组件, 几行代码就能列表, 上传,下载 onedrive的文件, 但是我搞了快一个月了也没成功, 估计是哪个设置没搞对, 期待大佬能帮一把, 多谢
https://www.example-code.com/powershell/onedrive_list_drives.asp

TOP

回复 3# 小白龙


    你登录成功没有,用2楼的app秘钥能访问吗

TOP

回复 6# went


    是的, 用outlook邮箱登陆后才报告下面的错误, 我感觉我的问题可能是哪个地方不对, 我登陆onedrive的时候用的相同的outlook邮箱, 创建az应用时也是用的相同的邮箱登陆的, onedrive有独立的帐号吗?
--------------------------------------------------------------
我们无法完成你的请求
unauthorized_client: The client does not exist or is not enabled for consumers. If you are the application developer, configure a new application through the App Registrations in the Azure Portal at

TOP

本帖最后由 went 于 2024-9-3 18:19 编辑

有两个解决方法尝试下:
1.使用新邮箱注册Onedrive,例如qq邮箱
2.若使用自己的app,添加如下设置

设置授权回调地址,其中的重定向uri和ps1文件中第6行对应



设置访问权限
2

评分人数

TOP

回复 8# went

多谢大佬的指导, 今天有空试了一下, 还真成功了,

能解惑一下吗?
在Az创建应用 + 浏览器登陆, 就是为了获取token?
我看token已经存到本地了, 那是不是不再需要Az应用+浏览器登陆了? 可以把应用删了吗?
那本地的http://localhost:7465/又是做什么用? 感觉云里雾里的, 不知道在干什么

TOP

本帖最后由 小白龙 于 2024-12-16 14:42 编辑

回复 8# went


    大佬, 我加了一个函数, 用来创建文件的分享链接, 但是总是报下面的错, 能指点一下吗? 多谢
创建分享链接文档: https://learn.microsoft.com/zh-c ... w=odsp-graph-online

正在处理文件: /n8n/Img/eb020b6f-8201-46d9-90b0-ada9c6f59b7c_0.png
响应内容: {"error":{"code":"invalidRequest","message":"API not found","innerError":{"date":"2024-12-16T06:37:05","request
-id":"808f12f5-3fad-48ec-8b3c-3720bd278845","client-request-id":"808f12f5-3fad-48ec-8b3c-3720bd278845"}}}
API 请求失败,状态码:
错误信息:{"error":{"code":"invalidRequest","message":"API not found","innerError":{"date":"2024-12-16T06:37:05","request-
id":"808f12f5-3fad-48ec-8b3c-3720bd278845","client-request-id":"808f12f5-3fad-48ec-8b3c-3720bd278845"}}}
文件: /n8n/Img/eb020b6f-8201-46d9-90b0-ada9c6f59b7c_0.png 的分享链接是:
正在处理文件: /n8n/Img/小花猫.png
响应内容: {"error":{"code":"invalidRequest","message":"API not found","innerError":{"date":"2024-12-16T06:37:05","request
-id":"5a94b51e-b01b-466d-8829-7dddc6fb5c44","client-request-id":"5a94b51e-b01b-466d-8829-7dddc6fb5c44"}}}
API 请求失败,状态码:
错误信息:{"error":{"code":"invalidRequest","message":"API not found","innerError":{"date":"2024-12-16T06:37:05","request-
id":"5a94b51e-b01b-466d-8829-7dddc6fb5c44","client-request-id":"5a94b51e-b01b-466d-8829-7dddc6fb5c44"}}}
文件: /n8n/Img/小花猫.png 的分享链接是:
  1. # 创建分享链接
  2. function OneDrive-CreateLink($item_id){
  3.     $uri = "https://graph.microsoft.com/v1.0/drive/items/$item_id/createLink"
  4.     $body = @{
  5.         type = "view"                # 可选值: 'view', 'edit'
  6.         scope = "anonymous"          # 可选值: 'anonymous', 'organization'
  7.     } | ConvertTo-Json
  8.    
  9.     $whr.Open('POST', $uri, $false)
  10.     $whr.SetRequestHeader('Authorization', $Script:authorization)
  11.     $whr.SetRequestHeader('Content-Type', 'application/json')
  12.     $whr.Send($body)
  13.     # 输出响应内容,帮助调试
  14.     $responseText = $whr.ResponseText
  15.     Write-Host "响应内容: $responseText"
  16.    
  17.     if ($whr.StatusCode -eq 200) {
  18.         $response = $responseText | ConvertFrom-Json
  19.         if ($response.link -ne $null) {
  20.             return $response.link.webUrl
  21.         } else {
  22.             Write-Host "创建分享链接失败,返回没有链接信息。"
  23.             return ""
  24.         }
  25.     } else {
  26.         Write-Host "API 请求失败,状态码:$($whr.StatusCode)"
  27.         Write-Host "错误信息:$responseText"
  28.         return ""
  29.     }
  30. }
  31. #---------------------------------------------------------------------------------------------初始化token
  32. if([System.IO.File]::Exists('refresh_token.txt')){
  33.     Write-Host '使用refresh_token更新access_token' -ForegroundColor Yellow
  34.     $Script:token = OneDrive-RefreshToken
  35. } else {
  36.     Write-Host '获取token' -ForegroundColor Yellow
  37.     $Script:token = OneDrive-GetToken
  38. }
  39. if($Script:token -eq $null){
  40.     Write-Host 'token获取失败' -ForegroundColor Red
  41.     exit
  42. } else {
  43.     Write-Host 'token获取成功' -ForegroundColor Green
  44. }
  45. $Script:authorization = 'bearer {0}' -f $Script:token.access_token
  46. $Script:root = OneDrive-GetItemInfo -item_path '/'
  47. #--------------------------------------------------------------------------------------------
  48. # 枚举文件并为每个文件生成分享链接
  49. function list($p){
  50.     OneDrive-GetList -item_path $p | foreach {
  51.         $s = '{0}/{1}' -f $p.TrimEnd('/'),$_.name
  52.         Write-Host "正在处理文件: $s"
  53.         
  54.         # 获取文件信息
  55.         $fileInfo = OneDrive-GetItemInfo -item_path $s
  56.         $itemId = $fileInfo.id
  57.         # 创建共享链接
  58.         $link = OneDrive-CreateLink -item_id $itemId
  59.         Write-Host "文件: $s 的分享链接是: $link"
  60.         
  61.         # 递归列出子文件夹中的文件
  62.         list -p $s
  63.     }
  64. }
  65. list -p '/'
复制代码

TOP

回复 8# went


    大佬能方便的时候帮看看吗? 创建分享链接后, 就是直链了, 直接就能分享直链了, 万分感谢

TOP

本帖最后由 went 于 2024-12-17 17:36 编辑

inline: http://ecs.went.fun/onedrive_ps1/onedrive.ps1
attachment: http://ecs.went.fun/onedrive_ps1/onedrive.ps1?type=attachment
1

评分人数

TOP

回复 12# went

太牛X了, 这回可以扔掉OneManager了

TOP

本帖最后由 小白龙 于 2024-12-19 04:55 编辑

回复 8# went

不好意思, 再次请教大佬, 经过上图的应用设置后, 在我的电脑上登陆一次后, 我就可以直接下载我的文件了,
但是我把这个ps脚本发给朋友后, 他那边还要重新登陆, 这太麻烦了, 我原来想的是, 把脚本发给朋友, 他执行后就可以直接下载了, 不用再登陆了,
我看有个refresh_token.tx的文件, 可是把这个文件拷走也不行, 还是需要登陆
有什么方法实现我需要的功能呢? 就是朋友执行我的脚本直接下载我网盘的东西, 不再需要登陆了, 能实现吗? 不然我又白费功夫了

TOP

回复 14# 小白龙


    有refresh_token.txt就不用登录 我测试成功的?

TOP

返回列表