Как отключить общий анализ параметров в функциях PowerShell? - PullRequest
3 голосов
/ 24 декабря 2010

Я бы хотел отключить «общие параметры» PowerShell для одной из моих функций. Я работал над набором расширений для p4.exe (утилита командной строки Perforce), написав такую ​​функцию:

function p4(
    [parameter(valuefromremainingarguments=1)]
    [string[]]$cmdline)
{
    # ...do some fun stuff with $cmdline...
    p4.exe $cmdline  # for illustration only - actual implementation uses .net objects
}

Смысл в том, чтобы иметь возможность использовать p4 точно так же, как я обычно делаю в командной строке, за исключением того, что иногда магическим образом обрабатываются некоторые параметры (для добавления новых команд или для вызова различных инструментов или чего-либо еще), и всегда будет казаться, что я я просто использую обычную командную строку p4.

Это работает довольно хорошо, пока я не начну использовать такой параметр, как '-o'.

p4 -p 1666 user -o scobi

В этом случае я получаю сообщение об ошибке от PowerShell:

p4 : Parameter cannot be processed because the parameter name 'o' is ambiguous. Possible matches include: -OutVariable -OutBuffer.

Единственный способ, который я нашел, это процитировать мои параметры:

p4 -p 1666 user '-o' scobi
p4 '-p 1666 user -o scobi'

Гадкий, и мешает моей цели сделать эту функцию прозрачным надмножеством p4.exe.

Есть ли магический атрибут, который я могу прикрепить к своей функции, чтобы она говорила оболочке "Я не поддерживаю общие параметры"? Или есть другие способы обойти это?

1 Ответ

4 голосов
/ 24 декабря 2010

Не используйте расширенную функцию вообще, используйте обычную функцию без параметров.Внутри функции используйте $args для ссылки на аргументы.

function p4()
{
    $args
}

p4 -p 1666 user -o scobi

Вывод:

-p
1666
user
-o
scobi

ОБНОВЛЕНИЕ

Фактически функциявсе еще может использовать свои собственные параметры, например:

function p4($myparam)
{
    "param $myparam"
    $args
}

p4 -p 1666 user -o scobi -myparam value

Вывод:

param value
-p
1666
user
-o
scobi

Внимание: имена параметров не должны конфликтовать с другими потенциальными аргументами.Например, это не работает:

function p4($param)
{
    "param $param"
    $args
}

p4 -p 1666 user -o scobi -param value

Результат:

ERROR: ParameterBindingException:
p4 : Cannot bind parameter because parameter 'param' is specified more than once. ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...