Вы можете назвать это почти что угодно. Вы можете даже включить в название символ новой строки и эмодзи *.
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 не имеет хорошей поддержки Unicode, хотя язык поддерживает. Используйте ISE, чтобы лучше видеть символы.