【问题标题】:What is the use of -recurse in powershell?powershell中的-recurse有什么用?
【发布时间】:2022-01-02 13:15:19
【问题描述】:

对不起,这可能是一个愚蠢的问题:两者有什么区别

Remove-Item -recurse -Force -VerboseRemove-Item -Force -Verbose

如果我们将-recurse 用于文件夹和子文件夹,powershell 会在文件夹内一一删除文件。如果我们删除-recurse powershell,只需删除主文件夹而不检查文件夹内部。从技术上讲,如果没有-recurse,脚本不会运行得更快吗?

【问题讨论】:

  • 如果你在那种情况下不使用-Recurse,你通常会收到一个确认请求......好吧,每次我都累了。
  • @Lee_Dailey 您应该回答这个问题,因为使用 Windows 10 上的默认 PowerShell 设置(至少)是正确的。如果目录确实包含数据,您将收到提示,询问您是否确定。
  • @Seth - 我不确定什么时候达到回答质量......但我会接受你的建议并继续这样做。谢谢! [咧嘴]
  • 该命令在任何情况下都必须递归删除所有文件和子文件夹才能删除指定的目录,即使您没有指定-recurse。实际上只能删除空目录(在WinAPI 级别)。

标签: powershell


【解决方案1】:

当您在保存文件的目录树上使用Remove-Item 并且不使用-Recurse 时,您将收到标准的确认提示。因此,使用该参数使其运行时不会出现“您真的要这样做吗?”的延迟。提示。

这是一些人喜欢将Get-ChildItem -Recurse 的输出通过管道传输到Remove-Item 的原因之一。

【讨论】:

  • 您能否详细说明使用Get-ChildItem | Remove-Item 相对于Remove-Item -Recurse 的可能优势?
  • 这里是大约 12 年前的一篇脚本专家文章的链接,该文章说明了 Get-childItem -recurse 与 Remove-Item 的结合使用。 devblogs.microsoft.com/scripting/…
  • Get-ChildItem | Remove-Item 本身不一定有帮助,如果你不使用-Recurse:如果Get-ChildItem 的输出是/包含一个非空的目录,您也会收到确认提示。如果意图仅删除 filesGet-ChildItem -File | Remove-Item 确实有帮助,但是,如果 Remove-Item *Remove-Item *.foo 也可能无意中匹配 directories (Remove-Itemno -File(或-Directory)开关,这可以说是一个缺点)。 /cc @zett42
  • -Recurse 添加到Get-ChildItem 并没有帮助,因为没有-File,它仍然可能包含非空目录,没有-Recurse 应用到Remove-Item - 再次触发确认提示。
  • @mklement0 - 啊!我从来没有遇到过这种情况。谢谢你的信息! [咧嘴]
【解决方案2】:

tl;dr

通过 both -Recurse -ForceRemove-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 .

【讨论】:

  • 很高兴听到他们有帮助,@Shahpari。
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多