Пользовательский поставщик PowerShell RemoveItem
Я реализую собственный поставщик PowerShell. Сейчас я работаю над реализацией командлета 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 recurse?
Нужно ли мне получить значение (ответ на вопрос) другим способом? Как?
Если выше не представляется возможным, есть ли способ подавить вопрос?
2 ответа
В конечном итоге, если вас попросят удалить контейнер, он будет по своей сути рекурсивным, если только контейнер не содержит других контейнеров. Я считаю, что PowerShell запрашивает, потому что действие влияет больше, чем пользователь мог изначально знать (все содержимое контейнера), и требует подтверждения. Поэтому в этом случае, я думаю, -recurse используется для того, чтобы сказать PowerShell: "Я знаю, что делаю".
Где -recurse имеет больше смысла, если вы выполняете что-то вроде этого:
Remove-Item *.bak -recurse
В этом случае вы хотите рекурсивно искать файлы для удаления. К сожалению, параметр Recurse на Remove-Item не используется для этого использования - из документов:
Поскольку параметр Recurse в этом командлете неисправен, команда использует командлет Get-Childitem для получения нужных файлов и использует оператор конвейера для передачи их в командлет Remove-Item.
Таким образом, способ сделать это в настоящее время:
Get-ChildItem . -r *.bak | Remove-Item
Вы можете подавить вопрос, установив $ConfirmPreference="None"
http://blogs.msdn.com/b/powershell/archive/2006/12/15/confirmpreference.aspx