我写了一个函数“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
字符串
返回:我正在调用:C
我期待它返回:我正在调用:函数C。
我试过各种各样的方法,比如:
Param([scriptblock]$functionToCall)
型
无法将System.String转换为ScriptBlock
A -functionToCall $function:C
型
返回“写主机“函数C”
A - functionToCall (&C)
型
这在其余部分之前进行评估:
Function C
I'm Calling :
型
我相信这是编程101,但我不能工作出正确的语法或它是我做错了。
9条答案
按热度按时间deikduxw1#
我不确定这是最好的,但是:
字符串
9fkzdhlc2#
你有没有想过把ScriptBlock作为参数传递?
字符串
u0njafvf3#
**如果你真的想传递函数的 name,作为一个 string:使用
&
,*call操作符 * 来调用它:字符串
至于需要在
"..."
中使用$(...)
:请参阅this answer,它解释了PowerShell的字符串扩展(字符串插值)规则。上面的结果是
I'm calling: Function C
注意函数
C
如何使用 implicit 输出(与显式使用Write-Output
相同)来返回值。Write-Host
is generally the wrong tool to use,除非意图明确地只写入显示,绕过PowerShell的输出流。在以下情况下,通常需要
&
运算符:型
在这两种情况下,**要传递 * 参数 *,只需将它们放在:
& <commandNameOrScriptBlock>
之后;请注意splatting(@<var>
)是如何用于传递存储在自动$args
变量中的未绑定参数的。型
上面的结果是
I'm calling: Function C with args: one two
两次。备注:
$args
变量仅在 * 简单 *(非高级)脚本和函数中可用。param(...)
块上使用[CmdletBinding()]
属性和/或每参数[Parameter()]
属性是使脚本或函数成为advanced的原因,高级脚本和函数另外只接受绑定到 * 显式声明 * 参数的参数。[CmdletBinding(SupportsShouldProcess)]
的假设功能-您可以使用以下选项来传递参数:[Parameter(ValueFromRemainingArguments)] $PassThruArgs
,它隐式地收集调用时传递的所有位置参数。u5i3ibmn4#
你需要这个吗?
字符串
hm2xizp95#
邓肯的解决方案对我来说很有效。然而,当函数名中有破折号时,我遇到了一些问题。
我可以通过他的第三个例子来解决这个问题:
字符串
vktxenjb6#
用于传递沿着数量可变的命名参数
字符串
似乎可以很好地处理奇怪的函数名
型
和exe文件以及
型
不过看起来你还是要小心注射
型
7bsow1i67#
字符串
其中函数“substr”调用函数“strdel”作为$a参数。
来自https://github.com/brandoncomputer/vds的函数
hc8w905p8#
怎么样:
字符串
使用${function:...}将函数路径作为值。调用该函数并将结果保存到$res。
k4ymrczo9#
匿名函数/应用函数(其中参数是某些变量的值)
字符串