通过 PowerShell 识别文件夹中的 OneDrive 快捷方式

通过 PowerShell 识别文件夹中的 OneDrive 快捷方式

Microsoft 365/OneDrive 的最新升级允许用户将文档库的快捷方式添加到其个人 OneDrive 文件夹的根目录中:

添加 OneDrive 快捷方式

它在文件资源管理器中看起来像这样:

文件资源管理器中的 OneDrive 快捷方式

如何在 PowerShell 中识别这些文件夹?Get-ChildItem此快捷方式返回与“Documents”文件夹相同的字段,具体来说ModeAttributes字段相同,因此无法用于区分。

我遇到的问题是,我们有一个脚本可以备份用户的 OneDrive 文件夹(因为在还原 VM 快照时 OneDrive 很糟糕),但现在它正在拖入目标文件夹的全部内容。该脚本使用 robocopy,无法/xj正常工作。我需要识别这些快捷方式,以便我可以通过 将它们传递给 robocopy /xd

答案1

这很麻烦,因为 OneDrive 使用自己的 NTFS 类型ReparsePoint,因此即使是新版本的 powershell 也没有查看目标的工具,或者真正区分彼此。我确实发现他们有一个特定的重新解析点标记,通过使用Get-ReparsePointpowershell 社区扩展模块 (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

从我所做的少量测试来看,我认为您可以使用它来列出带有ReparsePointTagof 的目录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,会发生什么?

相关内容