PowerShell: передать функцию в качестве параметра

я написал функцию "A", которая вызовет одну из нескольких других функций. Чтобы сохранить функцию перезаписи "A", я хотел бы передать функцию, которая будет вызываться как параметр функции "A". Например:

function A{
    Param($functionToCall)
    Write-Host "I'm calling : $functionToCall"
}

function B{
    Write-Host "Function B"
}

Function C{
    write-host "Function C"
}

A -functionToCall C

Returns: я звоню: C

Я ожидаю, что он вернется: я вызываю: функция C.

Я пробовал различные вещи, такие как:

Param([scriptblock]$functionToCall)

не удается преобразовать систему.Строка в ScriptBlock

A -functionToCall $function:C

возвращает "Write-Host "Функция C"

A - functionToCall (&C)

это оценивает перед остальным:

 Function C
 I'm Calling :

Я уверен, что это программирование 101, но я не могу понять, правильный синтаксис или что я делаю неправильно. Любая помощь будет принята с благодарностью. большое спасибо.

5 ответов


это то, что вам нужно?

function A{
    Param($functionToCall)
    Write-Host "I'm calling : $functionToCall"

    #access the function-object like this.. Ex. get the value of the StartPosition property
    (Get-Item "function:$functionToCall").ScriptBlock.StartPosition

}

function B{
    Write-Host "Function B"
}

Function C{
    write-host "Function C"
}


PS> a -functionToCall c

I'm calling : c


Content     : Function C{
                  write-host "Function C"
              }
Type        : Position
Start       : 307
Length      : 43
StartLine   : 14
StartColumn : 1
EndLine     : 16
EndColumn   : 2

Я не уверен, что это лучший, но:

function A{
    Param([scriptblock]$FunctionToCall)
    Write-Host "I'm calling $($FunctionToCall.Invoke(4))"
}

function B($x){
    Write-Output "Function B with $x"
}

Function C{
    Param($x)
    Write-Output "Function C with $x"
}

PS C:\WINDOWS\system32> A -FunctionToCall $function:B
I'm calling Function B with 4

PS C:\WINDOWS\system32> A -FunctionToCall $function:C
I'm calling Function C with 4

PS C:\WINDOWS\system32> A -FunctionToCall { Param($x) "Got $x" }
I'm calling Got x

вы думали о прохождении ScriptBlock в качестве параметра?

$scriptBlock = { Write-Host "This is a script block" }
Function f([ScriptBlock]$s) {
  Write-Host "Invoking ScriptBlock: "
  $s.Invoke()
}

PS C:\> f $scriptBlock
Invoking ScriptBlock:
This is a script block

решение Дункана отлично сработало для меня. Однако я сталкиваюсь с некоторыми проблемами, когда имя функции имело тире в нем.

я смог обойти это, построив его третий пример:

function A{
    Param([scriptblock]$functionToCall)
    Write-Host "I'm calling $($functionToCall.Invoke(4))"
}

function Execute-FunctionWithDash($x)
{
    Write-Output "Function Execute-FunctionWithDash with $x"
}

PS C:\WINDOWS\system32> A -functionToCall { Param($x) Execute-FunctionWithDash $x }
I'm calling Function Execute-FunctionWithDash with 4

для переменного числа параметров

function L($Lambda,$Params){
   write-host "`nI'm calling $Lambda"
   write-host "`nWith parameters"; ft -InputObject $params
   iex "$Lambda @Params"
}

PS C:\>L ls @{'filter'='*.txt';'Attribute'='Archive'}