Как получить именованные, но необъявленные параметры в функции в Powershell? - PullRequest
0 голосов
/ 02 мая 2018

Вот пример того, что я пытаюсь сделать.

Function Get-Parameters { Echo $SomeMagicMethod.Get("Name"); }

Get-Parameters -Name "John Doe"

$SomeMagicMethod - это автоматическая переменная или любой другой метод для получения именованных необъявленных параметров.

Возможно ли это в Powershell?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

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

Я бы абстрагировал его в отдельную функцию (вы также можете передать $args, но это чище):

function Get-InvocationParameter
{
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [System.Management.Automation.InvocationInfo]
        $Invocation,

        [Parameter(Mandatory = $true, Position = 1)]
        [string]
        $ParameterName
    )

    $Arguments = $Invocation.UnboundArguments

    $ParamIndex = $Arguments.IndexOf("-$ParameterName")

    if($ParamIndex -eq -1){
        return
    }

    return $Arguments[$ParamIndex + 1]
}

Тогда используйте это так:

function Get-Parameter
{
    Get-InvocationParameter -Invocation $MyInvocation -ParameterName "Name"
}

И вы должны видеть аргументы сразу после -Name (или ничего):

PS C:\> Get-Parameter -Name "John Doe"
John Doe
PS C:\> Get-Parameter -Name "John Doe","Jane Doe"
John Doe
Jane Doe
PS C:\> Get-Parameter -ID 123
PS C:\>
0 голосов
/ 02 мая 2018

Если вы действительно хотите функцию с без параметров, $args это путь. (Почему вы захотите такую ​​вещь - это другой вопрос.) В любом случае, код, подобный следующему, будет анализировать массив $args в хеш-таблицу пар параметров / аргументов, которую вы можете использовать в остальной части тела функции.

function NoParams
{
    $myParams = @{}
    switch ($args)
    {
        -Foo {
            if (!$switch.MoveNext()) {throw "Missing argument for Foo"} 
            $myParams.Foo = $switch.Current 
        }
        -Bar {
            if (!$switch.MoveNext()) {throw "Missing argument for Bar"} 
            $myParams.Bar = $switch.Current 
        }
        -Baz {
            if (!$switch.MoveNext()) {throw "Missing argument for Baz"} 
            $myParams.Baz = $switch.Current 
        }
        default { throw "Invalid parameter '$_'" }
    }
    $myParams
}
0 голосов
/ 02 мая 2018

Вы можете определить специальный параметр для перехвата всех несвязанных аргументов:

Function Get-Parameters {
    Param(
        [Parameter(Mandatory=$true)]
        $SomeParam,

        [Parameter(Mandatory=$false)]
        $OtherParam = 'something',

        ...

        [Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)]
        $OtherArgs
    )

    ...
}

Однако, это даст вам массив с оставшимися аргументами. Не будет ассоциации между -Name и "John Doe".

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

Если вам нужна какая-то хеш-таблица с несвязанными «именованными» аргументами, вам нужно создать ее самостоятельно, например, как это:

$UnboundNamed   = @{}
$UnboundUnnamed = @()
$OtherArgs | ForEach-Object {
    if ($_ -like '-*') {
        $script:named = $_ -replace '^-'
        $UnboundNamed[$script:named] = $null
    } elseif ($script:named) {
        $UnboundNamed[$script:named] = $_
        $script:name = $null
    } else {
        $UnboundUnnamed += $_
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...