Я пытаюсь написать функцию 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 ':'
}
}
Но это кажется очень запутанным. Мне это также кажется относительно распространенным требованием, поэтому я ожидал, что его будет легко реализовать. Есть ли более простой способ, который я пропустил? Или, если нет, есть ли способ инкапсулировать обработку аргументов в подфункцию, чтобы мне не приходилось включать все это в каждую функцию, которую я хочу работать таким образом?
Мое конкретное требование состоит в том, чтобы я ' m писать сценарии, которые принимают команды 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 ':'
Дох: -)