我允许在Powershell中命名一个函数?

NO_*_*ICE 7 powershell

PS > function ]{1}
PS > ]
1
PS >
PS
Run Code Online (Sandbox Code Playgroud)

为什么这样做?

我还能说出什么功能?到目前为止我发现的所有作品都是*].

bri*_*ist 8

几乎任何东西都可以命名.您甚至可以在名称中包含换行符和表情符号*.

function Weird`nFunction??? { Write-Host hey }
$c = gcm Weird*
$c.Name
& $c
Run Code Online (Sandbox Code Playgroud)

转义有很多帮助:

function `{ { Write-Host cool }
`{

function `0 { Write-Host null }
gci function:\?
Run Code Online (Sandbox Code Playgroud)

我将补充说,对于变量也是如此,并且有一种语法可以消除在变量名中进行大多数转义的需要:( ${varname}而不是$varname).

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

${My variable has a first name,
it's
V
A
something
R,
whatever I dunno 
} = Get-Process
Run Code Online (Sandbox Code Playgroud)

你会注意到,如果你开始打字$MyTAB,它将以可用的方式完成标签.


为了(有些)回答为什么这应该工作,考虑变量名称本身只存储在.Net字符串中.考虑到这一点,为什么名称会有限制?

上限值如何这些名称的一部分可以在某些情况下使用,因为解析器会不明白什么用它做,如果名称不具有一定的转义字符,但PowerShell脚本的字面解析是不是唯一的方法使用函数或变量或其他语言结构,我已经展示了一些例子.

限制较少也意味着能够通过广泛支持字符集来支持其他语言和文化.

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

有些(人类)语言或文化不使用我们用英语做的相同引号字符,甚至不在键盘上使用它们.如果您必须继续切换键盘布局或使用ALT代码引用字符串,那么输入代码会有多烦人?

所以我在这里得到的是PowerShell实际上支持许多引号字符,例如,您认为这可能做什么:

'Hello’
Run Code Online (Sandbox Code Playgroud)

很明显,这不是右侧的"正确"报价集.但令人惊讶的是,这种方法效果很好,即使它们不是同一个角色.

如果您从用户输入生成代码并希望避免偷偷摸摸的注入攻击,这确实具有重要意义.

成像你做了这样的事情:

Invoke-Expression "echo '$($userMsg -replace "'","''")'"
Run Code Online (Sandbox Code Playgroud)

看起来你照顾生意,但现在想象如果$userMsg包含这个:

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

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

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

*PowerShell控制台对Unicode没有很好的支持,即使语言有.使用ISE可以更好地查看字符.