PowerShell 自定义提供程序 RemoveItem
Posted
技术标签:
【中文标题】PowerShell 自定义提供程序 RemoveItem【英文标题】:PowerShell custom provider RemoveItem 【发布时间】:2010-12-12 15:14:07 【问题描述】:我正在实现一个自定义 PowerShell 提供程序。我现在正在研究 remove-item cmdlet 实现。
RemoveItem 方法具有以下签名:
protected override void RemoveItem(string path, bool recurse)
当我键入:Remove-Item .\Myobject -recurse
时,PowerShell 基础结构会在 RemoveItem 方法的 recurse
参数中为我提供值 true
。
但是,当我输入: Remove-Item .\MyObject' 时,我会收到一个问题:
MyObject 中的项有子项,并且未指定 Recurse 参数。如果继续, 所有子项都将与该项目一起被删除。你确定你要继续吗? [Y] 是 [A] 全部是 [N] 否 [L] 全部否 [S] 暂停 [?] 帮助(默认为“Y”):
我猜这个问题是由 PowerShell 基础架构向我提出的。这很好,因为我要删除的对象是一个容器。如果我对上述问题回答“是”,则 PowerShell 基础结构不会设置递归参数。事实上,当我的 RemoveItem
方法被调用时,它是错误的。我会排除参数为真,因为我对问题的回答是肯定的。
我的问题是:
为什么 PowerShell 没有将 bool 递归参数设置为正确的值?
我是否需要以其他方式获取值(问题的答案)?怎么样?
如果上述不可行,有没有办法压制这个问题?
【问题讨论】:
这能回答你的问题吗? How to quietly remove a directory with content in PowerShell 【参考方案1】:你可以通过设置$ConfirmPreference="None"
来隐藏问题
http://blogs.msdn.com/b/powershell/archive/2006/12/15/confirmpreference.aspx
【讨论】:
【参考方案2】:最终,如果您被要求删除一个容器,那么它本质上是递归的,除非该容器不包含其他容器。我相信 PowerShell 会提示,因为该操作的影响超出了用户最初可能意识到的范围(所有容器的内容)并且需要确认。所以在这种情况下,我认为 -recurse 是用来告诉 PowerShell “我知道我在做什么”。
如果你要执行这样的事情,-recurse 更有意义:
Remove-Item *.bak -recurse
在这种情况下,您希望递归搜索要删除的文件。不幸的是,Remove-Item 上的 Recurse 参数因这种用法而被破坏 - 来自文档:
因为这里的 Recurse 参数 cmdlet 出错,命令使用 Get-Childitem cmdlet 以获取 所需的文件,它使用 管道操作员将它们传递给 删除项目 cmdlet。
所以目前的做法是:
Get-ChildItem . -r *.bak | Remove-Item
【讨论】:
以上是关于PowerShell 自定义提供程序 RemoveItem的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure PowerShell 中显示自定义错误消息并退出
powershell SNIP | VMware - VM - 获取“所有者”和“应用程序”自定义属性,并将其写入“Notes”字段