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的主要内容,如果未能解决你的问题,请参考以下文章

Powershell 加载自定义程序集配置文件

Wix Remove 自定义操作失败

在 Azure PowerShell 中显示自定义错误消息并退出

Powershell 中的自定义 XAML 命名空间

使用 7zip 压缩 powershell 5.0

powershell SNIP | VMware - VM - 获取“所有者”和“应用程序”自定义属性,并将其写入“Notes”字段