Как сделать У меня есть параметр массива, который принимает входные данные из аргументов или конвейера в Powershell?

Я пытаюсь написать функцию 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 ':'

Дох: -)

5
задан Justin Dearing 6 October 2011 в 21:42
поделиться