给定一个功能:
function log2 {param ([double]$x) [Math]::Log($x) / [Math]::Log(2) }
预期:log2(45/120) * 2
被解释为(log2(45/120)) * 2
并产生-2.83007499856
实际:log2(45/120) * 2
等于log2(45/120)
并产生-1,41503749927884
那是为什么?
对我而言,(log2(1/2) * 3) -eq (log2(1/2))
屈服于True
没有任何意义。
答案 0 :(得分:1)
出于同样的原因,你打电话:
Get-ChildItem -Path C:\Windows -File
而不是:
Get-ChildItem(-Path, C:\Windows, -File)
请记住,相同的命令行解析器必须处理所有内容。
仅仅因为你有一个命名参数并不意味着标准解析停止工作。
让我们检查你的命令。
log2(45/120) * 2
这会调用函数log2
。第一个参数是(45/120)
。第二个参数是'*'
,第三个参数是2
。第一个参数将分配给命名参数$x
。第二个参数是未命名的,因此它被分配给$args[0]
。第三个参数也是未命名的,因此它被分配给$args[1]
。
试试这个:
function log2 {param ([double]$x) [Math]::Log($x) / [Math]::Log(2); $args }
log2(45/120) * 2
您的输出将是:
-1.41503749927884
*
2
让我们试试这个功能:
function Get-ArgumentType { $args | Select-Object @{n='Argument';e={$_}},@{n='Type';e={$_.GetType().FullName}} }
Get-ArgumentType (45/120) * 2
输出结果为:
Argument Type
-------- ----
0.375 System.Double
* System.String
2 System.Int32
所以有三个不同的论点,它根本不认可*
作为运算符。
答案 1 :(得分:0)
如果您使用PowerShell命令语法而不是函数语法,这是有意义的。即log2(x)
与log2 x
相同。要将表达式指定为参数,必须在其周围放置括号。
(log2 45)
(log2 (45/120))
(log2 (45/120)) * 2