Я пытаюсь написать функцию Powershell, которая принимает аргумент массива.Я хочу, чтобы он вызывался с массивом либо как аргумент, либо как вход конвейера.Итак, вызов выглядит примерно так:
my-function -arg 1,2,3,4
my-function 1,2,3,4
1,2,3,4 | my-function
Достаточно просто получить первые два:
function my-function {
param([string[]]$arg)
$arg
}
Для ввода в конвейер, однако, это сложнее.С помощью ValueFromPipeline легко получить аргументы по одному в блоке процесса, но это означает, что переменная $ args - это одно значение с входом конвейера, но используется массив, если используется -args.Я могу использовать $ input в блоке END, но он вообще не получает ввода -args, а использование $ args в блоке END получает только конечный элемент из конвейера.
Я полагаю, что могуСделайте это, явно собирая значения аргументов из конвейера, используя блоки begin / process / end, следующим образом:
function my-function {
param([Parameter(ValueFromPipeline=$true)][string[]]$args)
begin {
$a = @()
}
process {
$a += $args
}
end {
# Process array here
$a -join ':'
}
}
Но это кажется очень грязным.Это также кажется мне довольно распространенным требованием, поэтому я ожидал, что его легко реализовать.Есть ли более простой способ, который я пропустил?Или, если нет, есть ли способ инкапсулировать обработку аргументов в подфункцию, чтобы мне не приходилось включать все это в каждую функцию, которую я хочу работать следующим образом?
Мое конкретное требованиечто я пишу сценарии, которые принимают команды SQL в качестве входных данных.Поскольку SQL может быть многословным, я хочу разрешить возможность использования команды в конвейере (возможно, сгенерированной другой командой или из get-contents в файле), но также разрешить использование формы аргумента для быстрого оператора SELECT.Поэтому я получаю серию строк из конвейера или в качестве параметра.Если я получу массив, я просто хочу объединить его с "n", чтобы сделать одну строку - обработка строки за строкой не подходит.
Я думаю, другой вопрос будет, есть ли лучший дизайн длямой сценарий, который делает получение многострочного ввода, как этот очиститель?
Спасибо - хитрость в том, чтобы НЕ использовать ValueFromPipeline тогда ...
Причина, по которой у меня было так много проблем с получениемвсе, что я хотел, работало так, что в моих тестовых сценариях я использовал $ args в качестве имени моей аргументной переменной, забывая, что это автоматическая переменная.Так что все работало очень странно ...
PS> 1,2,3,4 | ./args
PS> get-content args.ps1
param([string[]]$args)
if ($null -eq $args) { $args = @($input) }
$args -join ':'
Doh: -)