为什么Powershell将log2 45/120解释为log2“45/120”?

时间:2017-12-19 23:39:32

标签: powershell syntax

给定一个功能: function log2 {param ([double]$x) [Math]::Log($x) / [Math]::Log(2) }

预期:log2 45/120应该产生-1.41503749928

实际值: Cannot process argument transformation on parameter 'x'. Cannot convert value "45/120" to type "System.Double". Error: "Input string was not in a correct format." At line:1 char:6 + log2 45/120 + ~~~~~~ + CategoryInfo : InvalidData: (:) [log2], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,log2 那是为什么?

Uservoice

1 个答案:

答案 0 :(得分:0)

Powershell不知道45/100作为命令的参数是应该是一个计算表达式还是一个字符串,所以它选择一个字符串。它这样做是为了保留命令的参数。它试图将字符串转换为double,因为它不是数字字符串,所以它不能。

例如,我输入以下命令:

Get-Value 12/19/2017

Powershell在将12/19/2017传递给Get-Value之前应该对Get-Value做些什么?最安全的答案是 nothing 。如果Get-Value (12/19/2017) Get-Value "12/19/2017" 想要尝试转换它,那不是命令行解析器的工作。

是的,这些是明确的:

$()

但是Powershell需要有一个合理的默认值来覆盖所有内容,并且他们已选择将所有文字参数标记视为字符串,除非它们被指定为带括号的表达式,子表达式为{{1在某些情况下,使用{}的脚本块。

这是另一个例子。我们要说我希望所有文件的扩展名为.000,以4开头,以1结尾:

Get-ChildItem 4*1.000