如何使用 PowerShell 删除 OneDrive 中的非空文件夹?

Posted

技术标签:

【中文标题】如何使用 PowerShell 删除 OneDrive 中的非空文件夹?【英文标题】:How to use PowerShell to remove nonempty folder in OneDrive? 【发布时间】:2021-07-05 23:14:59 【问题描述】:

说明

无法删除 OneDrive 目录中的非空文件夹

重现步骤

    在 OneDrive 目录中启动 PowerShell
PS C:\Users\MyUserName\OneDrive>
    尝试使用 Remove-Item cmdlet 删除此目录中的非空文件夹,例如:.\test\ 文件夹
PS C:\Users\MyUserName\OneDrive> Remove-Item .\test\

预期结果

如果没有 -Recurse 参数,PowerShell 应该返回一条确认消息,例如

Confirm
The item at C:\Users\MyUserName\OneDrive\test\ has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

实际结果

PowerShell 返回错误信息

Remove-Item: Cannot remove item C:\Users\MyUserName\OneDrive\test\: The directory is not empty. : 'C:\Users\MyUserName\OneDrive\test\'

注意

    PowerShell 和 Administrator:PowerShell 得到相同的结果; 如果我退出 OneDrive 进程并在 OneDrive 目录下创建一个新的非空文件夹,PowerShell 可以正常删除它(见注 4,因为未同步的文件夹没有 ReparsePoint 属性); CMD 可以成功删除文件夹,这意味着我也可以在 PowerShell 中使用以下命令来删除文件夹。但我只想通过 PowerShell cmdlet 来实现我的目标;
cmd.exe /C "rd /s test"
    Get-ChildItem cmdlet 显示普通文件夹(未由 OneDrive 同步)的模式为“d”(目录),但同步文件夹的模式为“l”(重解析点)。这是我无法正常删除 OneDrive 目录下的文件夹的原因吗?

版本信息

PS版本:7.1.3

操作系统:Microsoft Windows 10.0.19042

OneDrive 版本:21.052.0314.0001 (Office 365 A1)

更新

我尝试删除 PowerShell 5 上的测试文件夹,但也失败了。

来自 PowerShell 5.1 的错误消息:

PS C:\Users\MyUserName\OneDrive> Remove-Item .\test\ -Force -Recurse
Remove-Item : Access to the cloud file is denied.
At line:1 char:1
+ rm .\test\ -Force -Recurse
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Remove-Item], Win32Exception
    + FullyQualifiedErrorId : System.ComponentModel.Win32Exception,Microsoft.PowerShell.Commands.RemoveItemCommand

【问题讨论】:

可以肯定Remove-Item 对文件和文件夹对象的处理方式不同。如果我记得我写了一个脚本来做类似的事情,我需要先删除文件,然后再删除文件夹。 如果您尝试使用 -Force 会发生什么? 试试-Recurse。你应该看看docs。 @Vivere 我试过了,但没用。通常,即使没有 -Recurse ,PowerShell 也应该返回确认消息(就像有问题的预期结果一样)而不是错误消息。 @SantiagoSquarzon 我试过了,但没有用。其实test文件夹里面并没有隐藏文件或文件夹,所以我觉得-Force参数无关紧要。 【参考方案1】:

我只是碰到了同样的事情,这对我有用:

Get-ChildItem -recurse .\test | Sort-Object -Property FullName -Descending | ForEach-Object  $_.Delete() 
(Get-Item test).Delete()

我是 PowerShell 的新手,所以可能有更优雅或更正确的方法来完成上述操作。

【讨论】:

它工作但不删除文件夹,只删除文件。【参考方案2】:

上一个答案没有处理隐藏文件, 您可以将这些添加到您的个人资料中

function rmc ($file) 
    (Get-Item $file).Delete()



function rmd ($folder) 
    Get-ChildItem -recurse -force $folder | Sort-Object -Property FullName -Descending | ForEach-Object  $_.Delete() 
    (Get-Item $folder).Delete()

【讨论】:

以上是关于如何使用 PowerShell 删除 OneDrive 中的非空文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PowerShell批量删除注册表项

如何使用PowerShell批量删除注册表项

如何使用PowerShell批量删除注册表项

如何使用PowerShell批量删除注册表项

如何使用PowerShell批量删除注册表项

如何使用 PowerShell 删除 OneDrive 中的非空文件夹?