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

私はfooです!

于 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-commandeを保持したい場合

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