美元符号,在PowerShell中

问题描述:

function关键字和脚本块我有这样的PowerShell脚本:美元符号,在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处理 - 但

什么的$:我的两两件事混淆{功能:函数名}代码(即一个美元符号后面的大括号后面功能后跟一个冒号后面的名字f Func2的意思是后跟一个大括号)我可以看到它调用了Func1,但我不明白它为什么起作用。

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

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

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

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

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

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

+0

我仍然对此感到困惑 - “要从函数:驱动器访问函数(获取它的内容,而不是调用它),请使用$ function:foo”。这是获取函数的内容,还是获得具有函数功能的脚本块?如果它只获取内容,那么如何在Func3中调用Invoke呢?此外,我还不清楚$ {function:foo}(即美元符号后面的大括号)的含义。 – 2013-03-24 16:42:37

+0

啊,好的@ andy-arismendi,你的编辑更好地解释了我的事情。有没有这方面的参考,或者你是否通过试验和错误发现了它?我搜索了高低,但我找不到任何官方文档。这不利于网络搜索美元符号和冒号。 – 2013-03-24 16:58:01

+0

内容是脚本块。 '$ function:Func2 | gm'显示你正在访问的内容。只需'PS> $ function:Func2'调用脚本块的ToString方法,以便仅显示文本内容。 – 2013-03-24 16:58:07