2017-04-20 7 views
1

PowerShell을 사용 해본 경험이 거의 없으므로 이진 형식으로 입력하는 동안 일부 비트 연산을 시도하고있었습니다 (읽기 쉽도록). 바이너리로 변환 할 때 다음과 같은 함수를 사용했다.PowerShell 함수 매개 변수로 표현식

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

출력 1111011을 기대 :

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

그런 다음 나는 다음과 같은 실행하려고했습니다.

놀랍게도 대신 11001101 (결과는 bin(unbin('11001101')))입니다. 위해

내 코드는 내가 더 괄호 안에 unbin 호출을 래핑하는 데 필요한 작동하도록하고 그 이유를 이해할 수 없다 :

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

왜 이러한 추가 괄호가 필요합니까?

답변

2

PowerShell의 함수 호출은 이 아닌 .NET 메서드를 호출하는 것과 유사합니다. 그래서 거기에 불필요한 괄호가 많이 있고 관련된 몇 개의 괄호가 빠져 있습니다. 다음 코드

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

첫 번째 unbin 호출 한 bin에 인수 (괄호의 전체 내용), 그러나 를 전달합니다.

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

(내가 잘못하지 않았 으면 세부 사항이 다를 수 있지만 (4 가지 일 수 있지만 그 주안점입니다)와 동일합니다.

PowerShell 함수를 호출 할 때 인수는 괄호 안에 전달되지 않습니다. 그리고 -bxor의 피연산자는 표현 자체를해야합니다, 그래서 어떤 파이프 라인은 괄호되어야한다 :

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

좋아, 잘 됐네요, 왜 객체 메소드가 필요합니까 괄호 예를 들어, ' "test".Split "e"는''test ''동안 작동하지 않습니다. –

+0

참고 PowerShell에 대한 경험이 거의 없으므로이 시점에서 cmdlet, 메서드 등의 차이점이 사라졌습니다. –

+0

.NET 메서드는 C#에서의 작동 방식과 비슷하게 호출됩니다. Cmdlet과 함수는 설계되었습니다. - 결국 쉘을 사용합니다. 인수는 공백으로 구분되는 쉘 명령과 같습니다. – Joey