Microsoft 365/OneDrive 的最新升级允许用户将文档库的快捷方式添加到其个人 OneDrive 文件夹的根目录中:
它在文件资源管理器中看起来像这样:
如何在 PowerShell 中识别这些文件夹?Get-ChildItem
此快捷方式返回与“Documents”文件夹相同的字段,具体来说Mode
,Attributes
字段相同,因此无法用于区分。
我遇到的问题是,我们有一个脚本可以备份用户的 OneDrive 文件夹(因为在还原 VM 快照时 OneDrive 很糟糕),但现在它正在拖入目标文件夹的全部内容。该脚本使用 robocopy,无法/xj
正常工作。我需要识别这些快捷方式,以便我可以通过 将它们传递给 robocopy /xd
。
答案1
这很麻烦,因为 OneDrive 使用自己的 NTFS 类型ReparsePoint
,因此即使是新版本的 powershell 也没有查看目标的工具,或者真正区分彼此。我确实发现他们有一个特定的重新解析点标记,通过使用Get-ReparsePoint
powershell 社区扩展模块 (pscx)。在本例中,Documents\
是指向 sharepoint 文档库的链接,TestFolder\
是 windows 资源管理器中创建的文件夹:
Get-ChildItem -Attributes ReparsePoint | Get-ReparsePoint
Path ReparsePointTag
---- ---------------
C:\users\user\OneDrive - domain.com\Documents 2415943706
C:\users\user\OneDrive - domain.com\Microsoft Teams Chat Files 2415943706
C:\users\user\OneDrive - domain.com\Notebooks 2415943706
C:\users\user\OneDrive - domain.com\TestFolder 2415976474
C:\users\user\OneDrive - domain.com\TestFolder\test.txt 2415943706
C:\users\user\OneDrive - domain.com\Test.txt 2415943706
我将标签值转换为十六进制,并使用此 Microsoft Docs 列表重新解析点标签来查看...不多,只是这些都是与 OneDrive 相关的:
2415935514 = 0x9000401A = IO_REPARSE_TAG_CLOUD_4
2415943706 = 0x9000601A = IO_REPARSE_TAG_CLOUD_6
2415976474 = 0x9000E01A = IO_REPARSE_TAG_CLOUD_E
从我所做的少量测试来看,我认为您可以使用它来列出带有ReparsePointTag
of 的目录2415943706
并将它们提供给您的 robocopy 脚本以将其排除。
重新考虑使用 robocopy 来备份用户本地的 onedrive 文件而不是 onedrive 原生的文件可能是一个更好的想法。
答案2
我找到了一种不同的方法来做到这一点,基于 OneDrive 将这些快捷方式的图标类型设置为特定的“链接”图标:
您可以检查每个文件夹中是否存在如下desktop.ini
指定的隐藏系统文件:IconResource=*OneDrive.exe,4
# get a list of folders in onedrive
$OneDriveDirs = Get-ChildItem $env:OneDrive -Recurse -Directory
# check each folder for the onedrive link icon
$OneDriveLinks = foreach ($folder in $OneDriveDirs) {
if (Test-Path $folder\desktop.ini) {
if ((Get-Content $folder\desktop.ini -Force) -match 'IconResource=.*OneDrive.exe,4') {
$folder
}
}
}
$OneDriveLinks.FullName
# outputs
C:\Users\user\OneDrive - domain.com\Documents
C:\Users\user\OneDrive - domain.com\General
我检查了其他 OneDrive 图标,并在索引处看到了第二个文件夹链接图标7,所以也许需要检查两者?
我还建议使用像 veeam 这样的实际备份服务,而不是备份本地同步的项目。例如,如果用户有一段时间没有登录 onedrive,会发生什么?