Пользовательский поставщик PowerShell RemoveItem

Я реализую собственный PowerShell. Теперь я работаю над реализацией cmdlet remove-item.

Метод RemoveItem имеет следующую подпись:

protected override void RemoveItem(string path, bool recurse)

Когда я печатаю: Remove-Item .\Myobject -recurse инфраструктура PowerShell предоставляет мне значение true в параметре recurse метода RemoveItem.

Однако, когда я набираю: Remove-Item.\MyObject 'У меня вопрос:

Элемент MyObject имеет дочерние элементы и параметр Recurse не указан. Если вы продолжите,  все дети будут удалены вместе с предметом. Вы уверены что хотите продолжить? [Y] Да [A] Да для всех [N] Нет [L] Нет для всех [S] Приостановить [?] Справка (по умолчанию "Y" ):

Я думаю, этот вопрос представлен моей инфраструктурой PowerShell. Это прекрасно, потому что объект, который я хочу удалить, представляет собой контейнер. Если я отвечу "да" на указанный выше вопрос, инфраструктура PowerShell не устанавливает параметр recurse. На самом деле это неверно, когда вызывается мой метод RemoveItem. Я бы хотел, чтобы параметр был истинным, потому что я ответил да на вопрос.

Мои вопросы:

  • Почему PowerShell не устанавливает параметр рекурсии bool в правильное значение?

  • Нужно ли мне получить значение (ответ на вопрос) каким-то другим способом? Как?

  • Если выше невозможно, есть ли способ подавить вопрос?

Ответ 1

В конечном счете, если вас попросят удалить контейнер, он по своей сути является рекурсивным, если контейнер не содержит другие контейнеры. Я считаю, что PowerShell запрашивает, потому что действие затрагивает больше, чем пользователь может сначала знать (все содержимое контейнера) и подтверждает подтверждение. Поэтому в этом случае я считаю, что -recurse используется, чтобы сказать PowerShell "Я знаю, что я делаю".

Где -recurse имеет больше смысла, если вы должны выполнить что-то вроде этого:

Remove-Item *.bak -recurse

В этом случае вы хотите рекурсивно искать файлы для удаления. К сожалению, параметр Recurse для Remove-Item не работает для этого использования - из документов:

Поскольку параметр Recurse в этом командлет неисправен, команда использует командлет Get-Childitem, чтобы получить нужных файлов, и он использует оператора трубопровода, чтобы передать их Remove-Item.

Таким образом, способ сделать это в настоящее время:

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