В чем смысл запуска одного слота PowerShell с знаком + (плюс)

Я столкнулся с одним слоем PowerShell script, для которого самый первый символ - знак + (плюс), и мне было интересно, что это значит.

Пример, который даст кодовую точку Unicode для символа "A":

+'A'['']

Ответ 1

Унарный + работает как неявный приведение к типу int32.

Парсер просто попытается преобразовать значение в правой части в целое.

Посмотрите (и перейдите) свое утверждение, как и синтаксический анализатор:

+'A'['']

Попробуйте "tokenize" этот оператор:

+ 'A' [ ''  ]
^  ^  ^  ^  ^
|  |  |  |  |
|  |  |  |  Array index close operator
|  |  |  Empty string
|  |  Array index open operator
|  Literal string of length 1 with value A
Unary + operator

Чтобы узнать, можем ли мы применить оператор +, нам нужно будет оценить правый аргумент:

'A'[''] 

Единственный способ, которым мы можем индексировать строку (например, 'A'), - это рассматривать ее как char[] и обеспечивать целочисленное значение между оператором [ и ]. Пустая строка сама по себе не является целым числом, но при неявном преобразовании в один она становится 0 (попробуйте [int]"" или '' -as [int] в powershell, чтобы увидеть это в действии). Теперь выражение выглядит примерно так:

'A'[0]

Этот char в индексе 0, очевидно, A, и поэтому теперь это наш правый аргумент, символ uppercase A.

Теперь мы применим унарные + и voila, получим соответствующее значение ASCII для char A, которое оказывается 65.

Аналогичным образом мы могли бы сделать:

+("A" -as [char])

Или, используя пример Briantist:

"A" -as [char] -as [int]

Если вы когда-нибудь задумывались, как синтаксический анализатор разбивает определенное утверждение на отдельные токены, используйте метод [PSParser]::Tokenize():

PS C:\> $errors = @()
PS C:\> $script = "+'A'['']"
PS C:\> $tokens = [System.Management.Automation.PSParser]::Tokenize($script,[ref]$errors)
PS C:\> $tokens | select Content, Type
Content     Type
-------     ----
+       Operator
A         String
[       Operator
          String
]       Operator

Ответ 2

Используется в кодировании для гольфа для преобразования в число. Он короче [int].

Значение [''] заключается в том, что квадратные скобки используются для получения a [char] из строки. '' - это пустая строка, которая принуждается к 0.

Ответчик ссылается на решение конкретной проблемы, где одним из ограничений было то, что цифры от 0 до 9 вообще не могли быть использованы в ответе.

Смотрите PowerShell One-Liner Contest 2015 и объяснение от этого (довольно блестящего) решения от победителя.