about_Data_Sections — 데이터 섹션 이해하기

about_Data_Sections — 데이터 섹션 이해하기

data 섹션을 쓰면 텍스트 문자열이나 읽기 전용 데이터를 스크립트 로직에서 분리해서 관리할 수 있어요. 이 문서에서는 그 개념과 사용법을 하나씩 정리해 드릴게요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_data_sections

본문

PowerShell용으로 작성한 스크립트에는 데이터만 담긴 data 섹션을 하나 이상 넣을 수 있어요. 어떤 스크립트나 함수, 고급 함수에도 data 섹션은 자유롭게 포함할 수 있고, data 섹션의 내용물은 PowerShell 스크립트 언어의 일부 지정된 하위 집합으로 제한된답니다.

데이터를 코드 로직에서 분리해 두면 로직과 데이터를 각각 더 쉽게 파악하고 관리할 수 있어요. 예를 들어 오류 메시지나 도움말 문자열 같은 텍스트 원본을 별도의 문자열 리소스 파일로 둘 수 있고, 코드 로직이 분리되어 있으니 보안 검사나 검증 테스트도 훨씬 수월해지죠.

PowerShell에서는 data 섹션으로 스크립트 국제화(i18n)를 지원할 수 있어요. 다른 언어로 번역할 수 있는 문자열을 분리하고 찾고 처리하기 쉽게 만들 때 data 섹션이 큰 도움이 된답니다.

data 섹션은 PowerShell 2.0 기능에서 처음 추가되었어요.

문법

data 섹션의 문법은 다음과 같아요.

data [<변수명>] [-SupportedCommand <cmdlet-이름>] {
    <허용된-내용>
}

data 키워드는 필수이며 대소문자를 구분하지 않아요. 허용되는 내용은 다음 요소들로 제한됩니다.

  • -match를 제외한 모든 PowerShell 연산자
  • if, else, elseif
  • 다음 자동 변수: $PSCulture, $PSUICulture, $true, $false, $null
  • 주석
  • 파이프라인
  • 세미콜론(;)으로 구분한 문들
  • 다음과 같은 리터럴:
a
1
1,2,3
"PowerShell 2.0"
@( "red", "green", "blue" )
@{ a = 0x1; b = "great"; c ="script" }
@'

 Hello, World 

'@
  • 기본적으로 data 섹션에 허용되는 cmdlet. 기본적으로는 ConvertFrom-StringData cmdlet만 허용돼요.
  • -SupportedCommand 매개 변수를 이용해서 data 섹션에 허용한 cmdlet.

data 섹션 안에서 ConvertFrom-StringData cmdlet을 쓸 때는 키-값 쌍을 작은따옴표나 큰따옴표 문자열, 또는 작은따옴표나 큰따옴표 here-string으로 감쌀 수 있어요. 다만 변수나 하위 식을 포함하는 문자열은 반드시 작은따옴표 문자열이나 작은따옴표 here-string으로 감싸야 해요. 그래야 변수가 확장되지 않고 하위 식이 실행되지 않으니까요.

-SupportedCommand

SupportedCommand 매개 변수는 지정한 cmdlet이나 함수가 데이터만 생성한다고 표시할 때 사용해요. 사용자가 직접 작성하거나 테스트해 둔 cmdlet과 함수를 data 섹션에 포함할 수 있도록 설계된 기능이랍니다.

SupportedCommand 값은 하나 이상의 cmdlet 또는 함수 이름을 쉼표로 구분한 목록이에요.

예를 들어 다음 data 섹션에는 직접 작성한 cmdlet이 포함되어 있어요.

data -SupportedCommand Format-Xml {
    Format-Xml -Strings string1, string2, string3
}

data 섹션 사용하기

data 섹션의 내용을 쓰려면 그 값을 변수에 할당하고, 변수 표기법으로 내용에 접근하면 돼요.

예를 들어 다음 data 섹션에는 here-string을 해시 테이블로 변환하는 ConvertFrom-StringData 명령이 들어 있어요. 변환된 해시 테이블은 $TextMsgs 변수에 할당된답니다.

$TextMsgs 변수는 data 섹션의 일부가 아니에요.

$TextMsgs = data {
    ConvertFrom-StringData -StringData @'
Text001 = Windows 7
Text002 = Windows Server 2008 R2
'@
}

$TextMsgs 안의 해시 테이블 키와 값을 접근하려면 다음 명령을 사용하세요.

$TextMsgs.Text001
$TextMsgs.Text002

또는 변수 이름을 data 섹션 정의에 넣을 수도 있어요. 예를 들면 다음과 같아요.

data TextMsgs {
    ConvertFrom-StringData -StringData @'
Text001 = Windows 7
Text002 = Windows Server 2008 R2
'@
}

$TextMsgs

결과는 이전 예제와 동일해요.

Name                           Value
----                           -----
Text001                        Windows 7
Text002                        Windows Server 2008 R2

예제

단순한 데이터 문자열이에요.

data {
    "Thank you for using my PowerShell Organize.pst script."
    "It is provided free of charge to the community."
    "I appreciate your comments and feedback."
}

허용된 변수를 포함하는 문자열이에요.

data {
    if ($null) {
        "To get help for this cmdlet, type Get-Help New-Dictionary."
    }
}

ConvertFrom-StringData cmdlet을 사용하는 작은따옴표 here-string이에요.

data {
    ConvertFrom-StringData -StringData @'
Text001 = Windows 7
Text002 = Windows Server 2008 R2
'@
}

ConvertFrom-StringData cmdlet을 사용하는 큰따옴표 here-string이에요.

data {
    ConvertFrom-StringData -StringData @"
Msg1 = To start, press any key.
Msg2 = To exit, type "quit".
"@
}

데이터를 생성하는 직접 작성한 cmdlet을 포함하는 data 섹션이에요.

data -SupportedCommand Format-Xml {
    Format-Xml -Strings string1, string2, string3
}

더 알아보기