1

次の関数を検討してください

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

使用法:

Function Foo { "In Foo" }
IfFunctionExistsExecute Foo

これは機能します。

ただし、これは機能しません。

Function Foo($someParam) 
{ 
     "In Foo"
     $someParam
}

IfFunctionExistsExecute Foo "beer"

しかし、これは私に醜いエラーを与えます:

IfFunctionExistsExecute : A positional parameter cannot be found that accepts argument 'beer'.
At C:\PSTests\Test.ps1:11 char:24
+ IfFunctionExistsExecute <<<<  Foo "beer"
    + CategoryInfo          : InvalidArgument: (:) [IfFunctionExistsExecute], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,IfFunctionExistsExecute

PSでこれを行うにはどうすればよいですか?

4

2 に答える 2

1

呼び出す関数と関数にオプションのパラメーターを作成してみてくださいIfFunctionExistsExecute。このようなもの:

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

Function Foo
{ 
    param ([parameter(Mandatory=$false)][string]$someParam)
    "In Foo" 
    $someParam
}

IfFunctionExistsExecute Foo
IfFunctionExistsExecute Foo "beer"

私にとってこれは次のようになります。

C:\test>powershell .\test.ps1
In Foo

In Foo
beer

C:\test>
于 2012-07-06T12:11:01.913 に答える
0

呼び出された関数にも引数を渡す必要があるかもしれません。

$arguments = $args[1..($args.Length-1)]
& $func @arguments
于 2012-07-06T11:35:27.003 に答える