给定一个功能:
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
那是为什么?
答案 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