2017-04-20 26 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