tl;dr
通过 both -Recurse 和 -Force 到 Remove-Item 以便(更多)可预测地删除(删除)给定文件夹,这 - 除非有任何权限和时间问题 - 删除文件夹及其可能包含的任何内容。
警告:这会立即删除目标文件夹中的所有内容,并且鉴于已删除的项目没有放入操作系统的回收站bin,只能通过专业软件恢复。
如果我们使用-recurse作为文件夹和子文件夹,powershell会在文件夹内一一删除文件。
更准确地说,它删除了目标文件夹的子树,即递归地删除位于目标文件夹中的所有文件和子文件夹,包括它们的文件和子文件夹,递归地,在删除目标文件夹本身之前。实际上,它会删除目标文件夹及其所有内容(如果有),但请注意警告:
- 是“受保护”项目,还需要
-Force,如下所述。
- 由于文件系统 API 在旧 Windows 版本中异步而导致间歇性故障,在底部部分进行了讨论。
事实上,在删除文件夹本身之前删除文件夹的所有内容是删除非空的唯一方法文件夹,技术上:文件系统 API不提供删除非空文件夹作为单个操作。
因为无意中删除整个子文件夹树可能会造成灾难性后果,因为安全机制 PowerShell 要求您发出删除非空文件夹的意图显式 -通过-Recurse。
-
如果您忽略传递
-Recurse 并且目标文件夹非空,您将获得交互式确认提示 - 无论是否指定-Force。选择[A] Yes to All(键入a)以删除文件夹及其所有内容 - 但请参阅下面对-Force 的额外需求。
也就是说,您确实还需要-Force,以便(更多)可预测地删除非空目标文件夹,因为-Force也使PowerShell删除“受保护”的文件和文件夹,它们是隐藏的文件和文件夹以及设置了ReadOnly 和/或System 属性的文件(在Windows 上)。
-
如果您在使用-Recurse 时忽略传递-Force 或在响应确认提示时交互选择[A] Yes to All,则至少一个受保护项目的存在将防止整个目标文件夹被删除,尽管子树中的未受保护项将立即被删除。
-
每个受保护的项目都会导致发出一个非终止错误,最后一个非终止错误表明目标文件夹不能被删除,因为它不是空的(还)。可能令人困惑的是,在 Windows PowerShell 中,每个受保护项目的错误消息仅涉及“[in]sufficient 访问权限”,尽管在这种情况下真正的问题不是 权限之一; _PowerShell (Core) 7+ 中的错误消息已被修改,以明确提及隐藏项、系统项和只读项。
如果我们删除-recurse powershell,只需删除主文件夹而不检查文件夹内部。
否:根据上述情况,您不能删除给定的非空文件夹除非您先删除其内容。
如果您在没有-Recurse 的情况下尝试这样做,您总是会收到确认提示(或者,在非交互式场景中,调用将失败彻底)。
从技术上讲,如果没有-recurse,脚本不会运行得更快吗?
从上面也可以看出只有一个空文件夹可以被删除没有-Recurse而不触发确认提示。。 p>
如果您确实在针对空文件夹时还指定-Recurse,假设可以执行不必要的测试子项是否存在的工作。在实践中,Remove-Item 的实现总是执行这个测试,无论你是否通过-Recurse。
即使同时指定了-Recurse 和-Force,整体删除也可能失败:
-
...由于当前用户相对于目标文件夹及其内容持有的文件系统权限不足。
-
...间歇性,由于运行在 Windows 版本早于 Windows 10 20H2(我不知道 Windows Server 版本对应),因为文件系统项删除存在固有的异步(!),导致间歇性未能完全删除给定的目标文件夹,即如果删除项目 inside 在尝试删除文件夹本身时该文件夹尚未完成:有关详细信息和解决方法,请参阅 this answer .