4

我发现了这篇很棒的帖子:在带参数的函数上使用 Invoke-Command -ScriptBlock

我正在尝试使函数调用 ( ${function:Foo}) 动态化,就像我想传递函数名称一样。

我试过这个:

$name = "Foo"
Invoke-Command -ScriptBlock ${function:$name}

但这失败了。我也尝试了各种转义序列,但就是不能让函数名是动态的。


编辑:为清楚起见,我添加了一个小测试脚本。当然,想要的结果是调用ExternalFunction.

Function ExternalFunction()
{
  write-host "I was called externally"
}

Function InternalFunction()
{
    Param ([parameter(Mandatory=$true)][string]$FunctionName)
    #working: Invoke-Command -ScriptBlock ${function:ExternalFunction}
    #not working: Invoke-Command -ScriptBlock ${invoke-expression $FunctionName}
    if (Test-Path Function:\$FunctionName) {
    #working,but how to use it in ScriptBlock?
    }
}

InternalFunction -FunctionName "ExternalFunction"
4

3 回答 3

6

替代解决方案:

function foo {'I am foo!'}

$name = 'foo'

$sb = (get-command $name -CommandType Function).ScriptBlock
invoke-command -scriptblock $sb

我是富!

于 2013-02-09T19:42:46.603 回答
2

您可以尝试以下方法。它在尝试运行它之前测试指定的名称是否是一个有效的函数:

$myfuncnamevar = "Foo"
Invoke-Command -ScriptBlock {
    param($name)
    if (Test-Path Function:\$name) { 
        #Function exists = run it
        & $name
    }
} -ArgumentList $myfuncnamevar
于 2013-02-09T15:54:07.210 回答
1

很简单:

invoke-expression  $name

或者如果您想保留调用命令进行远程处理,例如

Invoke-Command -ScriptBlock { invoke-expression  $name}
于 2013-02-09T15:52:38.777 回答