用+(加号)符号开始PowerShell一行是什么意思?



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

给出字符'A' Unicode码位的示例:

+'A'['']

一元+作为类型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(尝试在powershell中查看[int]""'' -as [int])。现在语句看起来更像这样:

'A'[0]

索引0处的char显然是A,所以它现在是我们的右参数,大写字母a

我们现在应用一元+,瞧,我们得到了char A对应的ASCII值,正好是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

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

['']的意义在于使用方括号从字符串中获取[char]''是一个被强制转换为0的空字符串。

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

查看PowerShell One-Liner Contest 2015以及获胜者对这个(相当出色的)解决方案的解释。

最新更新