表达式作为PowerShell函数参数

时间:2017-04-20 10:23:05

标签: function powershell operator-precedence

我没有使用PowerShell的经验,所以我在输入二进制文件时尝试做一些按位操作(纯粹是为了可读性)。我使用以下函数来转换为二进制和从二进制转换它们似乎有用。

function bin($a){
    return [convert]::ToString($a,2)
}
function unbin($a){
    return [convert]::ToInt64($a,2)
}

然后我试图运行以下内容:

bin(unbin('11001101') -bxor unbin('10110110'))

期望输出1111011

令我惊讶的是,我得到了结果11001101bin(unbin('11001101'))的结果)。

为了让我的代码能够工作,我需要将unbin调用包含在更多括号中,我无法理解原因:

bin((unbin('11001101')) -bxor (unbin('10110110')))

为什么需要这些额外的括号?

1 个答案:

答案 0 :(得分:2)

请注意,PowerShell中的函数调用更类似于调用cmdlet,而不是 .NET方法。所以你在那里有很多不必要的括号,并且缺少一些相关的括号。以下代码

bin(unbin('11001101') -bxor unbin('10110110'))

将一个参数传递给bin(括号的完整内容),但三个传递给第一个unbin调用。它相当于

unbin '11001101' -bxor "unbin('10110110')"

(如果我没有弄错;细节可能会有所不同(可能是四个),但这就是它的要点)。

调用PowerShell函数时,参数不会在括号中传递。 -bxor的操作数必须是表达式本身,因此任何管道都必须加括号:

bin ((unbin '11001101') -bxor (unbin '10110110'))