6

このことを考慮:

Function Foo 
{
    param(
        #????
    )
}

Foo を次のように呼び出したい:

Foo -Bar "test"

$bar パラメータが指定されていないことを爆発させずに。それは可能ですか?:)

アップデート:

これを機能させたい:

Function IfFunctionExistsExecute
{
    param ([parameter(Mandatory=$true)][string]$func, [parameter(Mandatory=$false)][string]$args)
    begin 
    {
        # ...
    }
    process
    {
        if(Get-Command $func -ea SilentlyContinue)
        {
            & $func $args   # the amperersand invokes the function instead of just printing the variable
        }
        else
        {
            # ignore
        }       
    }
    end
    {
        # ...
    }
}


Function Foo
{
    param([string]$anotherParam)
    process 
    {
        $anotherParam
    }
}

IfFunctionExistsExecute Foo -Test "bar"

これは私に与えます:

IfFunctionExistsExecute : A parameter cannot be found that matches parameter name 'Test'.
At C:\PSTests\Test.ps1:35 char:34
+ IfFunctionExistsExecute Foo -Test <<<<  "bar"
    + CategoryInfo          : InvalidArgument: (:) [IfFunctionExistsExecute], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,IfFunctionExistsExecute
4

2 に答える 2

8

私は2つの選択肢を提案します。

まず、関数全体 + そのパラメータを scriptblock パラメータとして ifFunction に渡すことを検討することをお勧めします...

または: ValueFromRemainingArguments を使用します。

function Test-SelfBound {
param (
    [Parameter(
        Mandatory = $true,
        HelpMessage = 'Help!'
    )]
    [string]$First,
    [Parameter(
        ValueFromRemainingArguments = $true
    )]
    [Object[]]$MyArgs
)

$Arguments = foreach ($Argument in $MyArgs) {
    if ($Argument -match '^-([a-z]+)$') {
        $Name = $Matches[1]
        $foreach.MoveNext() | Out-Null
        $Value = $foreach.Current
        New-Variable -Name $Name -Value $Value
        $PSBoundParameters.Add($Name,$Value) | Out-Null
    } else {
        $Argument
    }
}
    $PSBoundParameters | Out-Default
    "Positional"
    $Arguments

}

Test-SelfBound -First Test -Next Foo -Last Bar Alfa Beta Gamma

この場合、$MyArgs を使用して、必須パラメーター 'First' 以外のすべてを格納します。単純な場合よりも、それが名前付きパラメーター (-Next、-Last) であるか、位置パラメーター (Alfa、Beta、Gamma) であるかを教えてくれます。このようにして、高度な関数バインディング ([Parameter()] 装飾全体) の利点と、$args スタイルのパラメーターの余地を残すことができます。

于 2012-07-06T18:49:51.990 に答える
3

関数に渡される引数の配列である $args 変数を関数で使用できます。

function Foo()
{
    Write-Output $args[0];
    Write-Output $args[1];
}

Foo -Bar "test"

出力:

-Bar
test
于 2012-07-06T13:38:14.247 に答える