Powershell函数参考和命名约定

时间:2018-11-26 12:14:53

标签: powershell scripting powershell-v5.0 windows-scripting

我最近发现可以通过使用修饰符$function:进行引用来获取powershell的功能。但是我注意到一个奇怪的问题...

按照惯例,POSH对函数名称使用{Verb}-{Noun}惯例,其中{Verb}aproved POSH verb names的一部分。例如:Get-MemberInvoke-WebRequest

问题是,例如由于连字符,调用$function:Get-Member无效;如果您声明一个类似ShowMessage的函数并调用:$fn = $function:ShowMessage,它就可以正常工作。所以我想知道是否有办法逃避这个电话。

PS。:我确实知道另一种选择,但更为冗长:

function Show-Message { Write-Host "Foo"; }
$fn = (Get-Item "function:Show-Message").ScriptBlock;
$fn.Invoke();

更新:尽管@PetSerAl很有帮助并解释了问题,但我会将@Ansgar Wiechers的回答标记为答案,因为它有据可查。

1 个答案:

答案 0 :(得分:2)

function:是PSDrive,不是(scope)修饰符。至于使用类似变量的符号($function:name):带有特殊字符的变量名称的规则也适用于此。

来自documentation

  

包含特殊字符的变量名称

     

变量名称以美元符号开头。它们可以包括字母数字字符和特殊字符。变量名的长度仅受可用内存的限制。

     

变量名称应尽可能仅包含字母数字字符和下划线字符(_)。包含空格和其他特殊字符的变量名称难以使用,应避免使用。

     

要创建或显示包含空格或特殊字符的变量名称,请将变量名称括在括号中。。这会指示PowerShell逐字解释变量名称中的字符。

您的表示法应如下所示:

${function:Show-Message}

可以这样调用:

& ${function:Show-Message}