簡體   English   中英

具有動態函數名稱的Invoke-Command

[英]Invoke-Command with dynamic function name

我找到了這個很棒的帖子: 在帶參數的函數上使用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"

替代解決方案:

function foo {'I am foo!'}

$name = 'foo'

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

我很好!

您可以嘗試以下方法。 它會在嘗試運行它之前測試指定的名稱是否為有效函數:

$myfuncnamevar = "Foo"
Invoke-Command -ScriptBlock {
    param($name)
    if (Test-Path Function:\$name) { 
        #Function exists = run it
        & $name
    }
} -ArgumentList $myfuncnamevar

很簡單:

invoke-expression  $name

或者如果你想保持invoke-commande用於遠程處理,例如

Invoke-Command -ScriptBlock { invoke-expression  $name}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM