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

我会建议两种选择。

首先:您可能需要考虑将整个函数 + 它的参数作为脚本块参数传递给您的 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”之外的所有内容。比一些简单的 if 会告诉我它是命名参数(-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 回答