Пользовательский поставщик 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
Ответ 2
Вы можете подавить вопрос, установив $ConfirmPreference="None"
http://blogs.msdn.com/b/powershell/archive/2006/12/15/confirmpreference.aspx