$ pscmdlet.ShouldProcess (...) возвращает «Да» или «Да для всех» - PullRequest
8 голосов
/ 21 сентября 2010

Я пишу скрипт для создания виртуальных машин, и, очевидно, я хотел бы поддержать стандартную семантику подтверждения / whatif.Однако, если у меня есть несколько машин для создания, было бы хорошо, если бы я мог различать «Да» и «Да для всех», поэтому мне не обязательно подтверждать каждую машину.

$ pscmdlet.ShouldProcess возвращает только логическое значение, так как я могу определить разницу?

1 Ответ

9 голосов
/ 22 сентября 2010

Вот пример функции, которая принимает конвейерный ввод для имени компьютера и реализует желаемое поведение:

function set-something {
    [cmdletbinding(SupportsShouldProcess=$true)]
    param(
        [parameter(position=0, valuefrompipeline=$true)]
        $Computer,
        [parameter(position=1)]
        $Value
    )

    process {
        if ($pscmdlet.shouldprocess("Are you sure?")) {        
            write-host "setting machine $computer to $value"
        }
    }
}

"srv1","srv2","srv3" | set-something -value 42 -confirm

Если вы ответите «да», вам будет предложено перейти к следующей машине. Если вы ответите «да для всех», вам больше не будет предложено. Важной частью является то, что вы используете конвейерный ввод - это заставляет функцию выполняться в целом только один раз , но блок процесса внутри функции вызывается один раз для каждого входящего элемента трубопровод. Это позволяет ему помнить «да для всех» и не запрашивать последующие вызовы блоков процесса. Имеет смысл?

ОБНОВЛЕНИЕ: для этого не требуется использовать конвейер. Важно то, что функция должна поддерживать состояние, поэтому передача всех входных данных в массив или коллекцию в качестве параметра также будет работать. В этом случае вы бы сами перебрали коллекцию $ computer. С конвейером, эффективно оболочка зацикливается для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...