我最近发现可以通过使用修饰符$function:
进行引用来获取powershell的功能。但是我注意到一个奇怪的问题...
按照惯例,POSH对函数名称使用{Verb}-{Noun}
惯例,其中{Verb}
是aproved POSH verb names的一部分。例如:Get-Member
或Invoke-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的回答标记为答案,因为它有据可查。
答案 0 :(得分:2)
function:
是PSDrive,不是(scope)修饰符。至于使用类似变量的符号($function:name
):带有特殊字符的变量名称的规则也适用于此。
包含特殊字符的变量名称
变量名称以美元符号开头。它们可以包括字母数字字符和特殊字符。变量名的长度仅受可用内存的限制。
变量名称应尽可能仅包含字母数字字符和下划线字符(_)。包含空格和其他特殊字符的变量名称难以使用,应避免使用。
要创建或显示包含空格或特殊字符的变量名称,请将变量名称括在括号中。。这会指示PowerShell逐字解释变量名称中的字符。
您的表示法应如下所示:
${function:Show-Message}
可以这样调用:
& ${function:Show-Message}