我可以在Powershell中为函数命名什么?

时间:2018-11-03 20:29:42

标签: powershell

PS > function ]{1}
PS > ]
1
PS >
PS

为什么这样做?

我还能给函数命名什么?到目前为止,我发现所有可行的方法是*]

1 个答案:

答案 0 :(得分:8)

您几乎可以给它起任何名字。您甚至可以在名称中包含换行符和表情符号*。

function Weird`nFunctionの名前 { Write-Host hey }
$c = gcm Weird*
$c.Name
& $c

转义有助于许多事情:

function `{ { Write-Host cool }
`{

function `0 { Write-Host null }
gci function:\?

我还要补充一点,对于变量也是如此,并且有一种语法消除了对变量名进行大多数转义的需要:${varname}(与$varname相对)。

有了它,您可以轻松地做到:

${My variable has a first name,
it's
V
A
something
R,
whatever I dunno 
} = Get-Process

您会注意到,如果然后像$My TAB 这样输入,它将以可用的方式完成制表符。


要(某种程度上)回答为什么应该起作用,请考虑变量名称本身只是存储在.Net字符串中。考虑到这一点,为什么要限制名称?

在某些情况下会受到限制,因为某些名称不能在某些情况下使用,因为如果名称不正确,解析器将不知道如何处理。不能使某些字符转义,但是正如我所展示的一些示例一样,PowerShell脚本的文字解析不是使用函数或变量或其他语言构造的唯一方法。

减少限制还意味着可以通过广泛支持字符集来支持其他语言和文化。

为此,还有另一件事可能会让您感到惊讶:有许多不同的字符表示我们在代码中理所当然的相同或相似的事物,例如引号。

某些(人类)语言或文化只使用了与英语相同的引号字符,甚至没有在键盘上使用引号。如果您必须继续切换键盘布局或使用 ALT 代码来引用字符串,那么键入代码会有多烦人?

因此,我要说的是,PowerShell实际上确实支持许多引号字符,例如,您认为这可能会做什么:

'Hello’

很明显,这不是右侧的“正确”引号。但令人惊讶的是,即使它们字符不同,该方法也能正常工作。

如果您要通过用户输入生成代码并希望避免偷偷摸摸的攻击,那么这确实具有重要意义。

想象你做了这样的事情:

Invoke-Expression "echo '$($userMsg -replace "'","''")'"

好像您要处理业务,但现在假设$userMsg是否包含以下内容:

  

Hi’; gci c: -recurse|ri -force -whatif;'

对于它的价值,CodeGeneration类知道这些东西;)

Invoke-Expression "echo '$([System.Management.Automation.Language.CodeGeneration]::EscapeSingleQuotedStringContent($userMsg))'"

*即使该语言支持,PowerShell Console也无法很好地支持Unicode。使用ISE可以更好地查看字符。