Вот пример функции, которая принимает конвейерный ввод для имени компьютера и реализует желаемое поведение:
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. С конвейером, эффективно оболочка зацикливается для вас.