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