Функция оболочки в PowerShell: передача оставшихся параметров - PullRequest
8 голосов
/ 14 сентября 2011

Я пытаюсь написать в PowerShell функцию-обертку, которая в основном оценивает первый параметр и на основе этого запускает программу на компьютере. Все остальные параметры функции-обёртки затем должны быть переданы в программу, которая также запускается.

Так это должно выглядеть примерно так:

function test ( [string] $option )
{
    if ( $option -eq 'A' )
    {
        Write-Host $args
    }
    elseif ( $option -eq 'B' )
    {
        . 'C:\Program Files\some\program.exe' $args
    }
}

Теперь просто добавление $args не работает, так что я должен сделать, чтобы это работало? Другой вариант, вероятно, будет использовать Invoke-Expression, но это похоже на eval, поэтому я хочу избегать, если это возможно, и, кроме того, я думаю, что если я сделаю это так, я ограничусь параметрами только для строки, верно? Если возможно, я бы хотел иметь полную поддержку упакованной программы / командлета - в основном, как динамический псевдоним. Это вообще возможно?

Ответы [ 2 ]

11 голосов
/ 14 сентября 2011

Этот тип делает то, что вы просите. Вы можете столкнуться с проблемами, если вам нужно передать опции с префиксом тире исполняемому файлу, которые конфликтуют или вызывают неоднозначность с общими параметрами PowerShell. Но это может помочь вам начать.

function Invoke-MyProgram
{
    [CmdletBinding()]
    Param
    (
        [parameter(mandatory=$true, position=0)][string]$Option,
        [parameter(mandatory=$false, position=1, ValueFromRemainingArguments=$true)]$Remaining
    )

    if ($Option -eq 'A')
    {
        Write-Host $Remaining
    }
    elseif ($Option -eq 'B')
    {
        & 'C:\Program Files\some\program.exe' @Remaining # NOTE: @ not $ (splatting)
    }
}
3 голосов
/ 14 сентября 2011

То, что вы написали (за исключением синтаксической ошибки в else if - должно быть elseif), работает.Обратите внимание, что $args - это неназванные аргументы, превышающие параметры, ожидаемые функцией.

Так что если вы вызовите test как

test -option "A" 1 2 3

$argsиметь 1,2,3

Обратите внимание, что если вы позвоните test как

test -option "A" -other "B" 1 2 3

$args, будет иметь -other,B,1,2,3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...