我有这个powershell脚本:
function Func1 ($val)
{
Write-Host "$val is processed by Func1";
}
function Func2($val)
{
Invoke-Command -ScriptBlock `
${function:Func1} -ArgumentList "$val is processed by Func2 and";
}
function Func3($val)
{
$function:Func2.Invoke("$val is processed by Func3 and");
}
Func3 "Value";
这有效 - 它输出值由Func3处理并由Func2处理并由Func1 处理 - 但我对两件事感到困惑:
$ {function:function-name} 代码是什么(即一个美元符号后面跟着一个大括号函数后跟一个冒号后跟一个冒号Func2中函数的名称后跟一个结束大括号)是什么意思?我可以看到它调用Func1,但我真的不明白它为什么会起作用。
Func3中的 $ function:function-name.Invoke 代码是什么意思?我觉得它正在使用脚本块功能,因为调用了Invoke方法,但我不清楚 $ function.function-name 是一个脚本块。
答案 0 :(得分:6)
function:
是函数提供程序的PsDrive。所有功能都存储在此驱动器上。还有其他PsDrives包括variable:
和env:
。查看Get-PsProvider
和Get-PsDrive
了解更多信息。
要从function:
驱动器访问某个功能(获取其内容,而不是调用它),请使用$function:foo
,其中foo是要访问的功能的名称。
只有在访问名称中包含特殊字符的变量时,才需要使用大括号。
函数的内容是脚本块,这就是它被用作Invoke-Command
的scriptblock参数的原因。
function:
psdrive中的每一个东西都是一个脚本块,而scriptblock对象有一个Invoke
方法,允许你执行它们。