Пользовательский поставщик 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 метод называется. Я бы за исключением параметра, чтобы быть правдой, потому что я ответил да на вопрос.

Мои вопросы:

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

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

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

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

Другие вопросы по тегам