使用+(加号)符号启动PowerShell单线程的含义是什么?

Mar*_*bel 12 powershell

我遇到了一个PowerShell单线程脚本,第一个字符是+(加号)符号,我想知道这样做的意义是什么.

将为字符"A"提供Unicode代码点的示例:

+'A'['']
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 17

一元+作为该类型的隐式转换int32.

解析器只会尝试将右侧的值转换为整数.

让我们看看(并逐步执行)您的语句,就像解析器一样:

+'A'['']
Run Code Online (Sandbox Code Playgroud)

让我们尝试"标记化"该声明:

+ 'A' [ ''  ]
^  ^  ^  ^  ^
|  |  |  |  |
|  |  |  |  Array index close operator
|  |  |  Empty string
|  |  Array index open operator
|  Literal string of length 1 with value A
Unary + operator
Run Code Online (Sandbox Code Playgroud)

为了知道我们是否可以应用+operater,我们需要评估右手参数:

'A'[''] 
Run Code Online (Sandbox Code Playgroud)

我们可以索引到字符串(例如'A')的唯一方法是将其视为a char[],并在[]运算符之间提供整数值.空字符串本身不是整数,但是当隐式转换为1时,它变为0(尝试[int]""'' -as [int]在powershell中查看此操作).现在声明看起来更像是这样的:

'A'[0]
Run Code Online (Sandbox Code Playgroud)

这个char索引0很明显A,所以现在是我们的右手参数,字符大写A.

我们现在应用unary +和voila,我们得到char的相应ASCII值A,恰好是65.

我们同样可以做到:

+("A" -as [char])
Run Code Online (Sandbox Code Playgroud)

或者,使用Briantist的例子:

"A" -as [char] -as [int]
Run Code Online (Sandbox Code Playgroud)

如果您想知道解析器如何将某个语句拆分为单个标记,请使用以下[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
Run Code Online (Sandbox Code Playgroud)


bri*_*ist 5

它在代码高尔夫中用于转换为数字.它短于[int].

重要的['']是方括号用于[char]从字符串中获取a .这''是一个被强制进入的空字符串0.

提问者指的是特定问题的解决方案,其中一个限制是数字0到9根本不能用在答案中.

参见2015年PowerShell One-Liner竞赛以及获胜者对此(相当精彩)解决方案的解释.