2

我正在实现一个自定义PowerShell提供程序。我现在正在研究 remove-item cmdlet 实现。

RemoveItem 方法具有以下签名:

protected override void RemoveItem(string path, bool recurse)

当我键入时:Remove-Item .\Myobject -recursePowerShell 基础结构为我提供了 RemoveItem 方法true的参数中的值。recurse

但是,当我输入: Remove-Item .\MyObject' 我得到一个问题:

MyObject 中的项目具有子项,并且未指定 Recurse 参数。如果您继续,所有子项都将与该项目一起被删除。你确定你要继续吗?[Y] 是 [A] 全部是 [N] 否 [L] 全部否 [S] 暂停 [?] 帮助(默认为“Y”):

我想这个问题是由 PowerShell 基础设施向我提出的。这很好,因为我要删除的对象是一个容器。如果我对上述问题回答“是”,则 PowerShell 基础结构不会设置递归参数。事实上,当我的RemoveItem方法被调用时它是错误的。我会排除参数为真,因为我对这个问题的回答是肯定的。

我的问题是:

  1. 为什么 PowerShell 没有将 bool 递归参数设置为正确的值?

  2. 我是否需要以其他方式获得价值(问题的答案)?如何?

  3. 如果以上是不可能的,有没有办法压制这个问题?

4

2 回答 2

5

最终,如果您被要求删除一个容器,那么它本质上是递归的,除非该容器不包含其他容器。我相信 PowerShell 会提示,因为该操作的影响超出了用户最初可能意识到的范围(所有容器的内容)并且需要确认。所以在这种情况下,我认为 -recurse 用于告诉 PowerShell“我知道我在做什么”。

-recurse 更有意义的地方是,如果您要执行以下操作:

Remove-Item *.bak -recurse

在这种情况下,您希望递归搜索要删除的文件。不幸的是, Remove-Item 上的 Recurse 参数因这种用法而被破坏-来自文档:

由于此 cmdlet 中的 Recurse 参数有问题,该命令使用 Get-Childitem cmdlet 获取所需文件,并使用管道运算符将它们传递给 Remove-Item cmdlet。

所以目前这样做的方法是:

Get-ChildItem . -r *.bak | Remove-Item
于 2009-11-03T16:29:46.390 回答
0

您可以通过设置来抑制问题$ConfirmPreference="None"

http://blogs.msdn.com/b/powershell/archive/2006/12/15/confirmpreference.aspx

于 2011-08-10T02:40:12.103 回答