我正在实施自定义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
方法时,它是错误的。我会将参数除外,因为我的回答是肯定的。
我的问题是:
为什么PowerShell没有将bool recurse参数设置为正确的值?
我是否需要以其他方式获取价值(回答问题)?怎么样?
如果无法达到以上目的,是否有办法解决问题?
答案 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