Windows PowerShell – Command Parser


Windows의 새로운 쉘인 PowerShell은 사용자가 입력한 명령어에 대해서 파싱(Parsing) 처리를 하고 실제 실행을 하게 됩니다. 파싱에 대한 정확한 이해를 해야 정확한 명령어를 내릴 수 있습니다.

PowerShell은 예제서 입력한 Get-Process IEX*라는 Cmdlet 구문에 대해서 연속된 토큰의 형태로 세그먼팅(Segmenting)하게 됩니다. 첫번째 토큰에 "Get-Process", 두번째 토큰에 "IEX*"가 들어가게 됩니다. 당연히 명령어는 하나로 처리되게 됩니다.

명령어를 처리할 때, PowerShell의 파서는 아래의 두가지 모드중 하나로 처리하게 됩니다.

Expression Mode - 캐릭터 String 변수는 반드시 쌍따옴표(")안에 포함되어야 합니다. 만약 숫자가 쌍따옴표(")로 묶여있지 않을 경우엔 숫자 값으로 처리합니다.

Argument Mode - 아래의 문자로 시작하지 않는 각각의 값은 확장가능한 String으로 처리합니다.

달러($) - 변수 선언시 사용됩니다.
심볼(@) - 배열 선언시 사용됩니다.
쌍따옴표("), 따옴표(') - String 값을 묶을 때 사용합니다.
괄호 - Method 사용시 변수 입력 또는 Cmdlet을 묶을 때 사용합니다.

예제1 - 3+3 : Expression 모드 - 결과 숫자 4
예제2 - Write-Output 3+3 : Argument 모드 - 결과 String 6
예제3 - Write-Output (3+3) : Expression 모드 - 결과 숫자 6
예제4 - $b = 3+3 : Experssion 모드 - 결과 변수 b에 숫자 6을 할당
예제5 - Write-Output $b : Expression 모드 - 결과 숫자 6
예제6 - Write-Output $b+3 : Argument 모드 - 결과 String "6+3"

 

위의 두개의 예제의 차이가 느껴지시나요?
앞선 예제의 경우엔 Argument 모드로 처리된 것입니다. $a가 String으로 선언이 되었으므로, + 2를 Argument 모드로 처리하는 것입니다.(문자로 처리해야 하므로)
뒷 예제의 경우에는 Expression 모드로 처리된 것이죠.. $a가 String입니다. 그렇지만 $b가 Integer 2 값 뒤에 String이 나왔으므로, $a가 String에서 Integer로 컨버팅된 것입니다. 그러므로 Expression 모드로 처리한 것이죠. 이해가 되시나요?

 

자 그럼 위에 그림이 이해가 되실겁니다. 이해가 안되시는 분들은 위에 내용을 잘 읽어보시기 바랍니다. 다소 어렵게 느껴지지만 본인만의 이해론을 정리하시면 쉽게 느끼실 수 있습니다.

Skip to main content