2017-04-20 29 views
1

我几乎没有使用PowerShell的经验,因此我试图在输入二进制文件时进行一些按位操作(纯粹为了便于阅读)。我使用以下函数来转换和从二进制,他们似乎工作。作为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'))) 

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

回答

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')) 
+0

好了,这是伟大的,那么为什么对象的方法需要括号例如''test“.Split”e“''在'test'时不起作用.Split(”e“)'会做什么? –

+0

注意我几乎没有使用PowerShell的经验,所以在这一点上,我的cmdlet,方法等之间的区别就会消失。 –

+0

.NET方法的调用方式与它们在C#中的工作方式类似。 Cmdlet和函数的设计 - 毕竟它是一个shell,更像shell命令,其参数只是用空格分隔。 – Joey