由于Rclone在复制/移动文件到OneDrive过程中存在一些问题(特别是一些比较老的Rclone版本),容易导致部分文件出现大量历史记录。因为OneDrive对于历史记录同样计算占用空间,用户侧无法禁用该feature,所以产生了大量浪费。
对
rclone size One: --json
的结果进行检查,如果total - used - free - trashed
所得结果超过约 1710000 (应该是SharePoint保留空间) 的部分则基本可以代表历史记录所占空间
但Rclone不支持相关操作,且OneDrive历史记录在网页上处理相当麻烦(需要在 Site settings - Storage Metrics中对一个个文件的历史记录进行处理),在文件数众多的情况下难以有效处理。故很久之前,面对历史记录,我一般就直接放置处理(然后换用一个OD帐号)。
然而在开始使用Microsoft Graph API对OneDrive进行操作时,我就开始有意识的找一些脚本,然而很有意思的是,Graph API在目前无法对DriveItemVersion类型资源进行删除处理,此外也没有对OneDrive回收站以及二层回收站进行删除处理的相关方法。
皇天不负有心人,我终于找到一篇文章 Delete old document versions from OneDrive for Business | I learned it. I share it. ,它介绍了通过SharePoint形式,对OneDrive进行操作的方式,并提供了两个PowerShell脚本和一个该文作者的C#项目 https://github.com/balassy/OneDriveVersionCleaner。
结果一开始我使用PowerShell脚本时,就出现如上文中一样的因为文件数过多的错误,在尝试balassy/OneDriveVersionCleaner
时,又因为该项目不支持Recursive,而且我对PowerShell以及C#不熟悉便草草放弃了折腾。
今天晚上忙里偷闲,翻看了了其上面两个脚本以及C#项目的实现,发现对Powershell脚本稍作修改便可以正常使用。并将其上传至GitHub上分享:
项目地址 : https://github.com/Rhilip/OneDrive_VersionHistoryCleaner
食用方法
- 下载整个项目,项目中带有提取使用的两个动态链接库
Microsoft.SharePoint.Client.dll
以及Microsoft.SharePoint.Client.Runtime.dll
,你也可以参照原PowerShell脚本指引,下载并安装 SharePoint Online SDK 。 编辑
DeleteFileVersions.ps1
中最后几行($Url, $username, $AdminPassword
)至自己OneDrive对应项。而$ListTitle
项为其实搜索目录,一般情况下为Documents
或者文档
,如果搜索某一子目录,应修改为Documents/subfolder
样式。#Paths to SDK Add-Type -Path ".\Lib\Microsoft.SharePoint.Client.dll" Add-Type -Path ".\Lib\Microsoft.SharePoint.Client.Runtime.dll" #Enter the data $Url = "https://TODO-my.sharepoint.com/personal/TODO_SITE_NAME" $username = "TODO_USERNAME" $AdminPassword = ConvertTo-SecureString -String "TODO_PASSWORD" -AsPlainText -Force #$AdminPassword=Read-Host -Prompt "Enter password" -AsSecureString #$ListTitle = "文档" $ListTitle="Documents"
- 直接运行该Powershell脚本即可,你可以看到如下输出,其中第一行报错为处理目录时报错,可以不用管。脚本会遍历
$ListTitle
下所有文件,并自动删除多余的历史记录。
脚本修改
对原PowerShell脚本中使用的ViewXml,增加RowLimit限制,防止其超出Microsoft侧的硬限制。并使用do-while循环,对CAMLQuery附加ListItemCollectionPosition
属性使其支持翻页。
具体diff请看 : https://www.diffchecker.com/UjI8kqJI
太棒了,实测非常好用!经测试世纪互联亦通用
非常好用,太感谢了。
很好用,谢谢
感谢R酱,最近也遇到了这个问题然后搜到了你的脚本,发现脚本一直报错,然后就重新去rclone官网看了一下,现在rclone有一个cleanup指令可以清空回收站或者历史版本
是的,我已经在repo的README中有过注释说明。