如何在Powershell中的函数中获取已命名但未声明的参数?

时间:2018-05-01 22:03:55

标签: powershell

这是我想要做的一个例子。

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

Get-Parameters -Name "John Doe"

$SomeMagicMethod是一个自动变量或任何其他方法来获取命名的未声明参数。

在Powershell中可以吗?

3 个答案:

答案 0 :(得分:1)

你必须自己解析无界的论点,并在你正在寻找的任何参数名称之后找到正确的论点。

我在一个单独的函数中抽象它(你也可以传递$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:\>

答案 1 :(得分:1)

如果你真的想要一个带有 no 参数的函数,$args就是你的选择。 (为什么你想要这样的东西是一个不同的问题。)无论如何,像下面这样的代码会将$args数组解析成参数/参数对的哈希表,你可以在函数体的其余部分使用它。 / p>

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
}

答案 2 :(得分:0)

您可以定义一个特殊参数来捕获所有未绑定的参数:

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 += $_
    }
}