PowerShell自定义提供程序RemoveItem

时间:2009-11-03 12:48:47

标签: powershell powershell-provider

我正在实施自定义PowerShell提供商。我现在正在处理remove-item cmdlet实现。

RemoveItem方法具有以下签名:

protected override void RemoveItem(string path, bool recurse)

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

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

  

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

我想这个问题是由PowerShell基础设施提供给我的。这非常好,因为我要删除的对象是一个容器。如果我对上述问题的回答是肯定的,那么PowerShell基础结构不会设置recurse参数。实际上,当调用RemoveItem方法时,它是错误的。我会将参数除外,因为我的回答是肯定的。

我的问题是:

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

  2. 我是否需要以其他方式获取价值(回答问题)?怎么样?

  3. 如果无法达到以上目的,是否有办法解决问题?

2 个答案:

答案 0 :(得分:5)

最终,如果要求您删除容器,那么除非容器不包含其他容器,否则它本身就是递归的。我相信PowerShell会提示,因为操作影响的程度超过了用户最初可能知道的(所有容器的内容)并且需要确认。所以在这种情况下,我认为-recurse用于告诉PowerShell“我知道我在做什么”。

如果你执行这样的事情,那么-recurse更有意义:

Remove-Item *.bak -recurse

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

  

因为Recurse参数在此   cmdlet有问题,命令使用   得到的Get-Childitem cmdlet   所需的文件,它使用   管道运营商将它们传递给   Remove-Item cmdlet。

所以目前的方法是:

Get-ChildItem . -r *.bak | Remove-Item

答案 1 :(得分:0)

您可以通过设置$ConfirmPreference="None"

来解决问题

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