validate receive passing parameter multiple mandatory powershell parameter-passing calling-convention

receive - PowerShell: Pase la función como parámetro



powershell receive parameters (5)

He escrito la función ''A'' que llamará a una de una serie de otras funciones. Para guardar la función de reescritura ''A'', me gustaría pasar la función para que se llame como un parámetro de la función ''A''. Por ejemplo:

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

Devoluciones: estoy llamando: C

Estoy esperando que regrese: estoy llamando: Función C.

He intentado varias cosas como:

Param([scriptblock]$functionToCall)

No se puede convertir System.String a ScriptBlock

A -functionToCall $function:C

Devuelve "Write-Host" Función C "

A - functionToCall (&C)

Esto evalúa antes del resto:

Function C I''m Calling :

Estoy seguro de que esto es programación 101, pero no puedo resolver la sintaxis correcta o lo que estoy haciendo mal. Cualquier ayuda sería recibida con gratitud. Muchas gracias.


¿Esto es lo que necesitas?

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


¿Has pensado en pasar un ScriptBlock como parámetro?

$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


La solución de Duncan funcionó muy bien para mí. Sin embargo, me encontré con algunos problemas cuando el nombre de la función tenía un guion.

Pude sortearlo construyendo su tercer ejemplo:

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


No estoy seguro de que esto sea lo mejor, pero:

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


para un número variable de parámetros

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''}