Windows Powershell변수의 강력한 기능

Don Jones

VBScript나 KiXtart와 같은 Windows 기반 스크립트로 작업을 수행하는 사용자라면 변수는 일종의 데이터 저장 메커니즘에 불과하다고 생각해왔을 것입니다. Windows PowerShell에도 변수가 포함되어 있지만 이는 다른 스크립트 언어의 변수보다 훨씬 강력한 기능을 갖고 있습니다. Windows

PowerShell 변수는 실제로 Microsoft® .NET Framework의 기본 클래스로 매핑됩니다. 그리고 Framework에서 변수는 개체이기 때문에 데이터를 저장할 수 있고 여러 방법으로 조작할 수도 있습니다. Windows PowerShell™ 스크립트 언어에 내부 데이터 조작 함수가 포함되어 있지 않은 이유는 Windows PowerShell의 변수의 기능이 강력하기 때문입니다. 변수 자체에서 이미 기능이 제공되기 때문에 이러한 함수가 필요 없습니다.

변수 선언

Windows PowerShell의 New-Variable cmdlet를 사용하여 변수를 선언하고 초기 값을 할당할 수 있지만 반드시 cmdlet를 사용할 필요는 없습니다. 대신 다음과 같이 값을 할당하기만 하면 새 변수가 생성됩니다.

$var = "Hello"

Windows PowerShell에서 변수 이름은 항상 달러 기호($)로 시작되며 문자, 숫자, 기호 또는 공백을 혼합하여 사용할 수 있습니다. 공백을 사용할 때는 ${My Variable} = "Hello"처럼 변수를 중괄호 안에 넣어야 합니다. 이 예는 이름이 $var인 새 변수를 만들고 "Hello"라는 초기 값을 할당합니다. 이 경우 값이 문자열이기 때문에 Windows PowerShell에서는 문자열 데이터 형식을 사용하여 값을 저장합니다. .NET Framework 용어로 설명하자면 이것은 모든 변수 형식의 기본 제공 기능을 대부분 갖고 있는 System.String 클래스입니다. 예를 들어 $var에 있는 값을 모두 소문자로 보고 싶다면 다음과 같이 할 수 있습니다.

PS C:\> $var.ToLower()
hello
PS C:\>

ToLower 메서드는 System.String 클래스에 포함되어 있으며 문자열 값을 모두 소문자로 표시하지만, 변수 $var의 실제 내용을 변경하지는 않습니다. System.String 클래스가 수행할 수 있는 모든 기능에 대한 목록을 보려면 다음과 같이 문자열 변수를 Get-Member cmdlet로 보냅니다.

$var | get-member

그림 1이 그 결과이며 여기에는 문자열 조작에 사용되는 여러 메서드가 포함되어 있습니다. VBScript 문자열 조작 함수에서 제공되는 거의 모든 기능은 Windows PowerShell의 문자열 변수의 메서드를 통해 제공됩니다.

Figure 1 A look at the System.String class output

Figure 1** A look at the System.String class output **(더 크게 보려면 이미지를 클릭하십시오.)

관리 측면에서 볼 때 VBScript와 같은 언어의 문자열 함수보다는 여러 문자열 변수의 기능이 더 유용합니다. 파일에서 UNC(Universal Naming Convention) 경로를 읽은 후 이 경로에 대해 어떤 작업을 수행하는 스크립트를 작성했다고 가정해 보겠습니다. 경로를 사용하기에 앞서, 읽은 각 경로가 UNC인지 확인하려면 StartsWith 메서드를 사용합니다. 이 메서드를 사용하면 문자열의 값이 UNC에 필요한 백슬래시 문자로 시작되는지 확인할 수 있습니다.

PS C:\> $path = "\\Server\Share"
PS C:\> $path.StartsWith("\\")
True
PS C:\>

StartsWith는 True 또는 False 값을 반환하기 때문에 다음과 같은 논리 구문에 사용할 수 있습니다.

if ($path.StartsWith("\\")) {
 # code goes here
}

Windows PowerShell에서는 변수 메서드에 대한 일종의 자동 완성 기능을 제공하므로 입력해야 할 문자 수를 줄일 수 있습니다. $var에 문자열이 포함된 경우 다음과 같이 입력하고

$var. 

Tab 키를 누르면 $var 변수에 대한 첫 번째 메서드 이름이 표시됩니다. Tab 키를 한 번 더 누르면 다음 메서드로 이동하고 Shift+Tab을 누르면 이전 메서드로 돌아갑니다. 이러한 방법을 통해 사용할 수 있는 모든 메서드를 순환하여 원하는 메서드를 찾을 수 있습니다.

변수 혼동

지금까지의 예에서는 Windows PowerShell로 변수의 데이터 형식을 결정할 수 있었습니다. 변수에 문자열을 할당하는 것은 근본적으로 해당 변수를 System.String 클래스의 변수로 만드는 것과 같습니다. 반면, 변수에 숫자를 할당하면 일반적으로 변수는 정수가 됩니다. 더 구체적으로 말하자면 특정한 값의 범위를 저장할 수 있는 Int32가 되는 것입니다. 다음 예를 살펴보겠습니다.

PS C:\> $int = 5
PS C:\> $int | get-member

  TypeName: System.Int32

이 잘려진 출력을 보면 Windows PowerShell에서 $int를 자체적인 메서드 및 속성 집합이 있는 Int32로 처리한다는 것을 알 수 있습니다. 그리고 이 메서드 및 속성 집합은 문자열 형식의 집합보다 훨씬 적습니다.

$int는 값이 따옴표로 묶여 있지 않고 숫자로만 구성되어 있기 때문에 Int32가 되었습니다. 따옴표로 묶여 있었으면 System.String으로 해석되었을 것입니다.

사용할 데이터 형식을 Windows PowerShell에서 결정할 수 있도록 허용할 경우 항상 원하는 결과가 나오는 것은 아닙니다. 예를 들어 파일에서 값을 읽을 때 값이 항상 문자열로 처리되기를 바랄 수 있습니다. 그러나 일부 값에는 숫자만 포함되어 있을 수 있으며 Windows PowerShell에서는 이러한 값을 Int32 또는 다른 숫자 형식으로 처리할 가능성이 생깁니다. 이 경우 스크립트에 문제가 발생할 수 있습니다. Windows PowerShell에서 값을 문자열로 인식하지 않으면 System.String 클래스의 모든 메서드를 사용하지 못하게 되며, 스크립트에서 이런 메서드 중 하나를 사용해야 하는 경우에 문제가 발생합니다.

이 문제를 해결하려면 변수를 처음 사용할 때 형식을 선언하여 Windows PowerShell에서 해당 변수를 특정 형식으로 처리하도록 지정할 수 있습니다. 예를 들면 다음과 같습니다.

[string]$var = 5

일반적으로 $var는 Int32지만 여기서는 System.String 클래스와 연관된 모든 메서드를 사용할 수 있도록 하기 위해 Windows PowerShell에서 $var를 문자열로 처리하도록 했습니다. 또한 변수 형식 선언은 코드에 일종의 설명을 붙이는 역할도 하므로 이 코드를 보면 $var에 들어갈 데이터 형식이 무엇인지 확실하게 알 수 있습니다. 필자는 항상 습관적으로 모든 변수에 구체적 형식을 지정하여 Windows PowerShell 대신 필자 스스로 형식을 결정합니다. 이렇게 하면 스크립트의 동작을 더욱 잘 예측할 수 있으며 경우에 따라 디버깅 시간이 상당히 단축될 수도 있습니다.

물론 변수 강제 선언으로 인해 영향을 받는 부분도 있지만 이런 영향이 꼭 나쁜 것만은 아닙니다. 변수의 형식을 선언하지 않는 다음 예를 살펴보겠습니다.

PS C:\> $me = 5
PS C:\> $me = "Don"

$me 변수는 처음에는 Int32였지만 값 "Don"이 추가되자 Windows PowerShell에서 이를 문자열로 변경했습니다. Windows PowerShell에서는 명시적으로 변수를 특정 형식으로 설정한 경우가 아니면 필요에 따라 변수의 형식을 변경할 수 있습니다.

이 예에서는 [int] 형식 이름을 사용하여 $me를 Int32로 지정했습니다.

PS C:\> [int]$me = 5
PS C:\> $me = "Don"
Cannot convert value "Don" to type 
"System.Int32". Error: "Input string 
was not in a correct format."
At line:1 char:4
+ $me <<<< = "Don"

그런 다음 여기에 문자열 값을 할당하려고 하자 오류 메시지가 표시됩니다. $me를 Int32로 명시적으로 지정했기 때문에 Windows PowerShell에서는 문자열 "Don"을 정수 값으로 변환해야 합니다. 하지만 이렇게 변환하는 것이 불가능할 뿐 아니라 $me의 형식을 문자열로 변경할 수도 없기 때문에 오류 메시지가 표시된 것입니다.

다양한 형식

Windows PowerShell 내에서 사용할 수 있는 형식은 아주 다양합니다. 사실 모든 .NET Framework 형식을 사용할 수 있으며 사용 가능한 형식의 수는 수백 개에 달하지만 Windows PowerShell에는 자주 사용하는 몇 가지 데이터 형식이 바로 가기로 정의되어 있습니다. 그림 2는 그 중 일부 목록으로, 가장 많이 사용되는 10가지 형식의 바로 가기를 나타낸 것입니다. 전체 목록을 보려면 Windows PowerShell 설명서를 참조하십시오.

Figure 2 자주 사용하는 형식 바로 가기

바로 가기 데이터 형식
[datetime] 날짜 또는 시간
[string] 문자열
[char] 단일 문자
[double] 배정밀도 부동 소수점 수
[single] 단정밀도 부동 소수점 수
[int] 32비트 정수
[wmi] WMI(Windows Management Instrumentation) 인스턴스 또는 컬렉션
[adsi] Active Directory Services 개체
[wmiclass] WMI 클래스
[Boolean] True 또는 False 값

다음과 같이 전체 .NET Framework 클래스 이름을 사용하여 변수의 형식을 선언할 수도 있습니다.

[System.Int32]$int = 5

이 방법을 사용하면 .NET Framework에 있기는 하지만 Windows PowerShell에 특정한 바로 가기가 없는 형식을 사용할 수 있습니다.

형식 확장

Windows PowerShell의 가장 강력한 기능 중 하나는 이러한 변수 형식의 기능을 확장할 수 있다는 것입니다. Windows PowerShell 설치 폴더(일반적으로 %systemroot\system32\windowspowershell\v1.0에 있지만 64비트 시스템에서는 경로가 조금 다름)에는 types.ps1xml이라는 파일이 있습니다. 이 파일은 메모장 또는 PrimalScript와 같은 XML 편집기에서 편집할 수 있습니다. 기본적으로 다른 많은 형식들은 나열되어 있지만 System.String 클래스는 나열되어 있지 않습니다. 그러나 types.ps1xml 파일에 Sytem.String 형식을 추가함으로써 System.String 형식에 새 기능을 추가할 수 있습니다.

변경한 뒤에는 Windows PowerShell을 닫았다 다시 열어야 합니다. 또한 types.ps1xml에 서명하지 않았으므로 로컬 스크립트 실행 정책에서 서명되지 않은 스크립트 실행을 허용하도록 해야 합니다.

Set-executionpolicy remotesigned

이제 Windows PowerShell을 다시 시작하면 다음과 같이 새 기능을 사용할 수 있습니다.

PS C:\> [string]$comp = "localhost"
PS C:\> $comp.canping
True
PS C:\>

여기서 볼 수 있듯이 System.String 클래스에 CanPing 속성이 추가되었습니다. 이 속성은 로컬 컴퓨터가 문자열에 포함되어 있는 주소로 ping을 실행할 수 있는지 여부를 나타내는 True 또는 False를 반환합니다. 그림 3에서는 WMI 쿼리가 특수 변수인 $this를 사용하는 것을 볼 수 있습니다. $this 변수는 문자열에 포함되어 있는 현재 값을 나타내며 문자열 변수의 내용이 WMI 쿼리로 전달되는 방식입니다.

Figure 3 System.String 형식 확장

<Type>
  <Name>System.String</Name>
  <Members>
    <ScriptProperty>
      <Name>CanPing</Name>
      <GetScriptBlock>
      $wmi = get-wmiobject -query "SELECT *
FROM Win32_PingStatus WHERE Address = '$this'"
      if ($wmi.StatusCode -eq 0) {
        $true
      } else {
        $false
      }
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

변수의 활용

Windows PowerShell은 유연하고 풍부한 기능의 변수 형식을 제공하며 형식의 기능을 확장할 수 있는 유연한 시스템입니다. 이러한 기능 덕분에 스크립트에서 강력한 기능을 매우 쉽게 구현할 수 있습니다. 사실 변수는 복잡한 스크립트의 중요한 기초 요소가 될 수 있으며, 보다 복잡한 함수에서 볼 수 있는 고급 기능을 제공합니다.

온라인에서 자세한 내용 보기

매월 둘째 주 화요일에 열리는 이 웹캐스트에 참가하십시오. 웹캐스트에서는 Windows PowerShell에서 제공하는 다양한 스크립트 기능을 지속적으로 살펴봅니다. microsoft.com/events/series/donjonesscripting.mspx를 방문하여 지금 등록하십시오.

2007년 2월 20일 Windows PowerShell: The Scripting Crash Course

이 웹캐스트에 참가하면 Windows PowerShell의 변수, 언어 구문, 스크립트 및 함수에 대해 배울 수 있습니다. 1시간 동안 진행되는 이 특강에서는 Windows PowerShell의 간단하고도 효과적인 언어를 통해 Windows® 관리 자동화 작업을 보다 빠르게 수행할 수 있는 방법을 소개합니다. 또한 Windows PowerShell 스크립트를 간편하게 활용할 수 있도록 해 주는 타사의 몇 가지 도구도 살펴봅니다.

2007년 3월 20일 Windows PowerShell: Functions, Filters, and Efficiency

Windows PowerShell 함수와 필터를 사용하여 효과적이고 모듈화된 코드를 만드는 방법을 배웁니다. 함수와 필터를 완전하게 캡슐화할 수 있는 Windows PowerShell의 강력한 범위 지정 규칙을 살펴보고 프로젝트 전체에 이러한 함수와 필터를 손쉽게 재사용할 수 있는 방법을 살펴봅니다. 또한 Windows PowerShell의 전역 범위에 사용자 고유의 사용자 지정 함수를 추가하여 유용한 유틸리티 함수 라이브러리를 손쉽게 조합하는 방법도 소개합니다.

2007년 4월 17일 Windows PowerShell and Windows Management Instrumentation

Windows PowerShell에서는 WMI(Windows Management Instrumentation)의 모든 성능과 기능에 액세스할 수 있습니다. 이 웹캐스트에서는 Windows PowerShell을 사용하여 WMI에 액세스하는 방법뿐 아니라 Windows PowerShell 파이프라인을 통해 WMI 개체와 컬렉션을 전달하는 방법도 설명합니다. 또한 Windows PowerShell 스크립트에서 WMI 속성과 메서드를 활용하는 방법을 소개하고 WMI의 기본 보안 및 구성 기능을 설명합니다.

2007년 5월 22일 Windows PowerShell: Converting from VBScript

스크립트는 물론 더 나아가 현재 가지고 있는 기술을 VBScript에서 Windows PowerShell로 변환하고 싶으십니까? 이 웹캐스트에서 그 방법을 살펴보십시오. 본 웹캐스트에서는 VBScript의 모든 주요 구문과 기능을 Windows PowerShell에 포함시켜 VBScript 기술을 새로운 관리 환경으로 손쉽게 전환하는 방법을 소개하고, VBScript의 도구를 Windows PowerShell의 기본 스크립트 언어로 변환하는 방법을 설명합니다. 또한 Windows PowerShell의 고유 구조를 살펴보고, 보다 효과적이고 효율적인 작업을 위해 Windows PowerShell 스크립트 언어를 어떻게 사용해야 하는지 알아봅니다.

2007년 6월 19일 Windows PowerShell: Under-the-Hood Extensions

이 웹캐스트에서는 Windows PowerShell에서 .NET Framework의 강력하고 유연한 기능(문자열, 날짜 및 기타 데이터 형식을 관리할 수 있는 수백 개의 기본 제공 함수)을 사용하여 데이터를 처리하는 방법을 소개합니다. Windows PowerShell 스크립트를 사용하여 이러한 기능을 확장할 수 있다는 것을 알고 계셨습니까? 또한 컴퓨터 이름을 포함할 뿐만 아니라 컴퓨터의 실행 여부를 알려 줄 수 있는 문자열 변수를 만드는 방법에 대해서도 소개합니다. 외부 함수를 사용하지 않고도 자동으로 데이터의 서식을 지정할 수 있는 날짜 및 시간 변수를 만드는 방법에 대해서도 알아봅니다. 이 세션에 참가하면 모든 종류의 새로운 기능을 단 몇 분 이내에 Windows PowerShell에 구축하는 방법과 Windows 관리 작업을 보다 쉽고 빠르게 수행하는 방법을 확인할 수 있습니다.

Don Jones는 SAPIEN Technologies의 프로젝트 및 서비스 담당 이사이자 Windows PowerShell: TFM(SAPIEN Press)의 공동 저자입니다. 문의 사항이 있으시면 www.ScriptingAnswers.com으로 연락하십시오.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..