美元符号,在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-PsProvider
和Get-PsDrive
了解更多信息。
要访问function:
驱动器中的函数(获取其内容,请不要调用它),请使用$function:foo
其中foo是要访问的函数的名称。
仅当您访问名称中包含特殊字符的变量时才需要大括号。
函数的内容是脚本块,这就是为什么它被用作Invoke-Command
的脚本块参数的原因。
psdrive的function:
中的每一件东西都是一个脚本块,scriptblock对象有一个Invoke
方法可以让你执行它们。
我仍然对此感到困惑 - “要从函数:驱动器访问函数(获取它的内容,而不是调用它),请使用$ function:foo”。这是获取函数的内容,还是获得具有函数功能的脚本块?如果它只获取内容,那么如何在Func3中调用Invoke呢?此外,我还不清楚$ {function:foo}(即美元符号后面的大括号)的含义。 – 2013-03-24 16:42:37
啊,好的@ andy-arismendi,你的编辑更好地解释了我的事情。有没有这方面的参考,或者你是否通过试验和错误发现了它?我搜索了高低,但我找不到任何官方文档。这不利于网络搜索美元符号和冒号。 – 2013-03-24 16:58:01
内容是脚本块。 '$ function:Func2 | gm'显示你正在访问的内容。只需'PS> $ function:Func2'调用脚本块的ToString方法,以便仅显示文本内容。 – 2013-03-24 16:58:07