Как мне разрешить назвать функцию в Powershell? - PullRequest
0 голосов
/ 03 ноября 2018
PS > function ]{1}
PS > ]
1
PS >
PS

Почему это работает?

Что еще я могу назвать функцией? Все, что я нашел до сих пор, это работает * и ].

1 Ответ

0 голосов
/ 03 ноября 2018

Вы можете назвать это почти что угодно. Вы можете даже включить в название символ новой строки и эмодзи *.

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, чтобы лучше видеть символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...