5

我有这个 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 处理- 但我对两件事感到困惑:

Func2中的${function:function-name}代码(即美元符号后跟左花括号后跟函数后跟冒号后跟函数名称后跟右花括号)是什么意思?我可以看到它调用了 Func1,但我真的不明白它为什么起作用。

Func3中的$function:function-name.Invoke代码是什么意思?我感觉它正在使用脚本块功能,因为调用了 Invoke 方法,但我不清楚$function.function-name如何是脚本块。

4

1 回答 1

6

function:是函数提供程序的 PsDrive。所有功能都存储在该驱动器上。还有其他 PsDrives,包括variable:env:。查看Get-PsProviderGet-PsDrive了解更多信息。

要从function:驱动器访问函数(获取其内容,而不是调用它),请使用$function:foowhere foo 是要访问的函数的名称。

仅当您访问名称中包含特殊字符的变量时,才需要大括号。

函数的内容是脚本块,这就是为什么它被用作Invoke-Command.

function:psdrive中的每一件事都是一个脚本块,而脚本块对象有一个Invoke方法可以让你执行它们。

于 2013-03-24T07:35:13.973 回答