Exchange (특히 2013 버전에서는) 작업을 할 때 거의 필수 도구가 된 Powershell로 문자열 작업을 할 때 변수를 사용해야 하는, 또는 사용하고 싶은 경우가 많다.


예를 들어, 아래와 같은 Exchange 주소록 목록을 만들려고 할 때,

New-AddressList -Name "MyCompany_Org_AL" -RecipientFilter { `

((RecipientType -eq 'MailUniversalDistributionGroup') -and (CustomAttribute4 -eq 'C011') -and `

(CustomAttribute7 -eq 'ORG'))}

여기서, 빨간 색으로 표시한 [회사 이름]과 [회사 코드]를 변수로 지정해서 자동화 등에 사용하려면 어떻게 하면 될까?


$COMP_NAME='MyCompany'

$COMP_CODE='C011'


당연히, 위와 같이 먼저 변수를 정의하겠지...

그 다음으로,

New-AddressList -Name "$COMP_NAME_Org_AL" -RecipientFilter { `

((RecipientType -eq 'MailUniversalDistributionGroup') -and (CustomAttribute4 -eq '$COMP_CODE') -and `

(CustomAttribute7 -eq 'ORG'))}

이런 식으로 변수명을 문자열에다 입력해주면 된다고 생각할 것이다.
그런데, 위와 같이 쓰면 안된다. 위 문구에는 두 가지 오류가 있다.

첫 번째, "$COMP_NAME"은 제대로 "MyCompany"로 인식되지만 "$COMP_NAME_Org_AL"은 안된다. 밑줄이 연결되면서 COMP_NAME_Org_AL까지 통째로 변수명으로 인식하기 때문이다. 이를 방지하기 위한 방법은 "$()"로 문자열과 변수명을 아예 따로 분리하는 방법과 "${}"로 문자열 내에서 변수명만 분리하는 방법의 두 가지가 있다.

즉,
$($COMP_NAME + "_Org_AL")
처럼 쓰든가,
"${COMP_NAME}_Org_AL"
처럼 쓰면 된다.


두 번째, -RecipientFilter를 기술할 때 중괄호({}) 내에 '$COMP_CODE'라고 홑따옴표로 변수를 썼는데, 이렇게 쓰면 실제 변수로 치환되지 않고 "$COMP_CODE"라는 문자열이 그대로 사용된다. 변수명을 실제 데이터로 치환하기 위해서는 "" (따옴표) 내에 변수명을 써야 한다. 즉, -RecipientFilter {...}를 -RecipientFilter "..."로 바꿔주면 된다.

정상 동작하는 코드는 아래와 같다.
New-AddressList -Name "${COMP_NAME}_Org_AL" -RecipientFilter " `
((RecipientType -eq 'MailUniversalDistributionGroup') -and (CustomAttribute4 -eq '$COMP_CODE') -and `
(CustomAttribute7 -eq 'ORG'))"


...

그러면, 여기서 아래 코드는 정상 동작할까?
New-AddressList -Name "${COMP_NAME}_Org_AL" -RecipientFilter " `
((RecipientType -eq 'MailUniversalDistributionGroup') -and (CustomAttribute4 -eq '$COMP_CODE') -and `
(CustomAttribute7 -eq 'ORG') -and `
(CustomAttribute8 -eq $null) -and (CustomAttribute9 -eq $null) -and (CustomAttribute10 -eq $null))"

안타깝게도, 원하는 대로 정상 동작하지 않는다.
"$null" 변수가 중괄호({})가 아닌 따옴표("") 내에 들어가면 빈 문자열, 즉 없는 것과 마찬가지가 된다. 위 코드는 실제로 시스템에서는 아래와 같이 인식된다.
New-AddressList -Name "MyCompany_Org_AL" -RecipientFilter " `
((RecipientType -eq 'MailUniversalDistributionGroup') -and (CustomAttribute4 -eq 'C011') -and `
(CustomAttribute7 -eq 'ORG') -and `
(CustomAttribute8 -eq ) -and (CustomAttribute9 -eq ) -and (CustomAttribute10 -eq ))"
이처럼, $null 변수를 따옴표 내에 사용할 때는 위와 같은 상황에 주의해야 한다.
이럴 때 쓰라고 있는 기호가 바로 "`"(역 홑따옴표, backtick; back quatation mark)다. 이 역 홑따옴표는 Escape 문자로, 바로 뒤에 따라오는 문자를 치환하지 않고 있는 그대로 사용하라는 의미가 된다. 이미 위의 예제에도 줄바꿈 직전에 사용됐듯이 줄바꿈을 명령어의 끝이 아닌 줄바꿈 그대로 인식하게 했듯 따옴표(") 및 변수 선언 기호($) 등의 경우에도 똑같이 쓸 수 있다. 즉, 아래와 같이 쓰면 된다.

New-AddressList -Name "${COMP_NAME}_Org_AL" -RecipientFilter " `
((RecipientType -eq 'MailUniversalDistributionGroup') -and (CustomAttribute4 -eq '$COMP_CODE') -and `
(CustomAttribute7 -eq 'ORG') -and `
(CustomAttribute8 -eq `$null) -and (CustomAttribute9 -eq `$null) -and (CustomAttribute10 -eq `$null))"




Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]