윈도우 프로젝트 필수 유틸리티 3장 - PowerShell로 자동화하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

3장 PowerShell로 자동화하기

이재홍 http://www.pyrasis.com 2007.10.27 ~ 2008.04.20

목차

  1. PowerShell이란?
    1. PowerSHell의 주요 특징
    2. PowerShell로 작성하는 주요 스크립트
  2. PowerShell 설치
    1. .NET Framework 설치
    2. PowerShell 설치
  3. 기본 문법
    1. PowerShell의 기본 기능과 주요 cmdlet의 사용 방법
    2. PowerShell 스크립트 문법

PowerShell이란?

PowerSHell의 주요 특징

유닉스와 리눅스 운영체제는 기본적으로 모든 작업이 명령행 위주로 되어 있습니다. 이러한 이유 때문에 유닉스와 리눅스는 명령행 작업을 자동화 해주는 쉘 스크립트가 매우 발달해 있습니다. 그래서 쉘 스크립트를 실행해주는 쉘의 종류만도 10여 가지가 넘습니다.

하지만 마이크로소프트 윈도우는 최근까지 MS-DOS 시절부터 사용하던 배치 파일을 그대로 사용하고 있었습니다. 그럴만도 한 것이 마이크로소프트는 개인 사용자를 상대로 운영체제를 판매해왔기 때문에 쉘 스크립트는 그다지 필요한 기능이 아니었습니다.

시간이 플러 마이크로소프트가 서버 시장에 진출하면서 Windows 2000 Server와 Windows Server 2003을 출시하게 됩니다. Windows 2000 Server와 Windows Server 2003까지는 모든 서버 작업이 GUI(그래픽 인터페이스)로 되어 있습니다. GUI는 직관적이고 사용하기가 쉽다는 장점이 있지만, 자동화하는 것이 불편하다는 단점이 있습니다. 게다가 날로 복잡해지는 서버 환경에서 자동화를 배치 파일(NT 명령행 스크립트)로 하기에는 무리가 있었습니다. 그래서 마이크로소프트는 복잡한 서버 작업을 자동화하고, 쉘 스크립트에 익숙한 유닉스, 리눅스 서버 관리자를 흡수하기 위한 새로운 스크립트 언어인 PowerShell을 개발하게 되었습니다.

PowerShell은 .NET Framework 2.0 환경에서 개발되었기 때문에 .NET Framework 2.0이 설치되어 있어야만 설치 및 실행이 가능합니다. Windows Server 2008에 기본적으로 포함되어 있지만, Windows Server 2008 이하의 운여체제에서는 별도로 배포되는 설치 파일로 설치해야 합니다.

PowerShell은 기존의 배치 파일에서 할 수 없었던 이벤트 로그, 인증서, 레지스트리, WMI, Active Directory, COM, ADO, XML 등을 조작할 수 있으며, 정규식을 지원하고 .NET Framework 구성요소를 사용할 수 있습니다. 또한 배치파일의 복잡하고 어려운 문법 대신 Perl 혹은 유닉스의 쉘 스크립트와 흡사한 문법을 지원하기 때문에 강력한 스크립트를 작성할 수 있습니다.

PowerShell로 작성하는 주요 스크립트

이 책에서는 각 도구들간의 연동을 PowerShell을 이용하여 처리할 것입니다. PowerShell로 작성된 주요 스크립트는 다음과 같습니다.

  • 자동 버전 업데이트 스크립트
    Visual Studio로 작성된 프로젝트는 리소스 파일(.rc)에 파일 버전을 설정하게 됩니다. PowerShell을 이용하여 CruiseControl.NET의 state 파일(XML 형식)에서 버전을 읽어오고 버전을 증가시킨 뒤 리소스 파일(.rc)에 버전을 기록하게 됩니다. 배치 파일로는 XML 형식에서 데이터를 읽어올 수가 없고, 텍스트 파일의 내용을 변수에 저장하고 변수의 내용을 조작하는 것이 되지 않습니다.

  • 프로젝트 생성 스크립트
    Subversion 저장소와 Trac 프로젝트를 생성할 때 사용합니다. PowerShell은 Trac 설정 파일인 trac.ini 파일의 내용을 수정할 때 사용됩니다. 위와 마찬가지로 배치 파일로는 텍스트 파일 조작이 거의 불가능합니다.

  • Subversion과 PDB 파일 연동

Subversion 저장소 정보를 PDB 파일에 기록할 때 사용됩니다. 이 스크립트는 단순히 다른 실행 파일을 실행해주기만 하기 때문에 특별한 것은 없습니다.

  • Trac 동기화 스크립트
    Subversion 저장소와 Trac 프로젝트의 데이터를 최신 상태로 유지하기 위해 사용합니다. PowerShell은 모든 Trac 프로젝트의 디렉터리를 순회하며 trac-admin의 sync 명령을 실행할 때 사용됩낟. 배치 파일로는 이러한 동작이 불가능합니다.

  • Trac 버전 업데이트 스크립트
    CruiseControl.NET으로 빌드된 파일의 버전을 Trac에 자동으로 등록시킬 때 사용합니다. PowerShell은 CruiseControl.NET의 state 파일(XML 형식)에서 버전을 읽어와 Trac에 등록할 때 사용됩니다.

  • Trac을 통해 파일을 배포할 때의 파일 처리 스크립트
    빌드된 파일을 Trac을 통해 배포할 때 사용됩니다. PowerShell은 빌드된 파일의 커밋 로그 메시지를 처리할 떄 사용됩니다.

  • 백업 스크립트
    Subversion 저장소 및 Trac 프로젝트를 백업할 때 사용됩니다. PowerShell은 백업 파일을 저장할 디렉터리를 날짜 형식으로 만들고, 특정 기간이 지났을 때 박업 파일을 삭제할 때 사용됩니다. 배치 파일에서는 날짜를 원하는 형식으로 구할 수가 없고, 날짜 계산도 되지 않습니다(2008-01-01, 2008.1.1, 08.01.01 등과 같은 다양한 날짜 형식, 2008년 3월 5일의 30일 전 날짜 구하기).

PowerShell 설치

Windows XP, Windows Server 2003, Windows Vista는 별도로 배포되는 설치 파일을 이용하여 설치해야 합니다. Windows XP는 최초 설치시 .NET Framework가 설치되어 있지 않고, Windows Server 2003은 .NET Framework 1.1이 설치되어 있습니다. PowerShell은 .NET Framework 2.0이 설치되어 있어야 사용할 수 있으므로 Windows Update를 통해 설치하거나, 아래 URL에서 .NET Framework 2.0 설치 파일인 dotnetfx.exe를 받아서 설치합니다. 단 Windows Vista는 최초 설치시 .NET Framework 2.0이 설치되어 있으므로 따로 설치할 필요가 없습니다.

  • 다운로드 세부 정보 : .NET Framework 버전 2.0 재배포 가능 패키지(x86)
    http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5

.NET Framework 설치

  1. 먼저 .NET Framework 2.0을 설치합니다. dotnetfx.exe를 실행시켜 .NET Framework 2.0 설치 마법사가 실행되면 다음을 눌러 넘어갑니다.


    그림 3-1 .NET Framework 2.0 설치 시작

  2. 최종 사용자 사용권 계약에 관한 대화상자가 나타나면, 동의함(A)에 체크하고 설치를 눌러 설치를 시작합니다.


    그림 3-2 최종 사용자 사용권 계약

  3. 설치가 제대로 끝났는지 확인하고, 마침을 눌러 설치를 종료합니다.


    그림 3-3 설치 완료

현재 필자는 Widnwos Server 2003으로 서버를 운영하고 있어서 .NET Framework 2.0도 따로 설치하였고, Windows Server 2003용 PowerShell을 사용하고 있습니다.

PowerShell 설치

PowerShell은 마이크로소프트 웹 사이트의 아래 URL에서 간단한 정품 인증 과정을 거쳐 다운로드할 수 있습니다. 각 운영체제에 맞게 설치하면 됩니다.

운영체제URL설치 파일명
Windows XPhttp://support.microsoft.com/kb/926140/koWindowsXP-KB926140-v2-x86-KOR.exe
Windows Server 2003http://support.microsoft.com/kb/926140/koWindowsServer2003-KB926140-v2-x86-KOR.exe
Windows Vistahttp://support.microsoft.com/kb/928439/koWindows6.0-KB928439-x86.msu
표 3-1 운영체제별 PowerShell 다운로드 웹사이트 주소 및 파일명
  1. 운영체제에 맞는 설치 파일을 실행하면 PowerShell 설치 마법사가 나타나면서 설치가 시작됩니다. 내용을 확인한 후 다음을 누릅니다.


    그림 3-4 Windows PowerShell 1.0 설치 시작

  2. 사용권 계약에 관한 내용이 나타납니다. 이때 동의함(A)을 선택한 후 다음을 눌러 넘어갑니다.


    그림 3-5 사용권 계약

  3. 설치가 완료되었습니다. 마침을 눌러 설치를 종료합니다.


    그림 3-6 Windows PowerShell 1.0 설치 완료

기본 문법

PowerShell의 문법은 유닉스의 쉘 스크립트 문법과 비슷합니다. 유닉스의 쉘 스크립트는 데이터를 파일 단위로 처리하지만, PowerShell은 데이터를 메모리 객체로 처리한다는 것이 다른 점입니다. PowerShell의 파일 확장자는 ps1입니다.

PowerShell의 기본 기능과 주요 cmdlet의 사용 방법

먼저 간단한 예제를 통해 PowerShell의 기본 기능과 주요 cmdlet(command-let) 사용 방법을 알아본 뒤 스크립트 문법을 알아보겠습니다.

PowerShell의 모든 명령은 cmdlet(command-let)으로 이루어져 있습니다. 기본적으로 Get-Help, Get-Content, Start-Service 등과 같이 동사-명사의 형식으로 구성되어 있습니다. 이 cmdlet을 조합하여 다양한 동작을 실행할 수 있습니다. 각 명령의 도움말을 보려면 Get-Help Start-Service -full과 같이 하면 됩니다.

PowerShell은 최초 설치시 보안 문제 때문에 기본적으로 ps1 스크립트 파일을 실행 할 수 없도록 설정되어 있습니다. 따라서 아래 명령을 통해 ps1 스크립트 파일을 실행할 수 있게 설정해야 합니다.

시작 → 모든 프로그램 → Windows PowerShell 1.0 → Windows PowerShell을 실행하고 아래와 같이 입력합니다.

PS C:\> Set-ExecutionPolicy RemoteSigned

TIP
공유 폴더에 위치한 서명되지 않은 Powershell 스크립트를 실행하려면 다음과 같이 실행합니다.

PS C:\> Set-ExecutionPolicy Unrestricted

이제 PowerShell의 기본 기능들을 실습해보겠습니다. 시작 → 모든 프로그램 → Windows PowerShell 1.0 → Windows PowerShell을 실행합니다.

기존 명령 프롬프트와 마찬가지로 디렉터리 목록 보기 명령은 dir입니다. 하지만 PowerShell에서는 유닉스 명령인 ls도 지원합니다. 디렉터리간 이동은 그대로 cd를 사용합니다.

PS C:\> ls
PS C:\> cd C:\

시스템 내의 모든 프로세스 목록을 볼 수 있습니다. 정규식 형태의 옵션을 사용할 수도 있습니다. 즉 [s]*라고 하면 s로 시작하는 모든 프로세스를 출력합니다.

PS C:\> Get-Process
PS C:\> Get-Process [s]*

레지스트리 접근도 가능합니다. 레지스트리로 이동하는 방식은 디렉터리를 이동하는 방식과 같습니다. cd HKLM:라고 입력하면 HKEY_LOCAL_MACHINE으로 이동하고, cd HKCU: 라고 하면 HKEY_CURRENT_USER로 이동하게 됩니다. 주의할 점은 실제로 HKLM이나 HKCU라는 디렉터리가 있을 수 있기 때문에, 레지스트리 HKLM, HKCU 뒤에는 :(콜론)을 반드시 붙여주어야 합니다.

레지스트리로 이동하게 되면 프롬프트는 PS C:\>에서 PS HKLM:\>으로 바뀌게 됩니다. dir 또는 ls 명령으로 레지스트리 키의 내부를 확인할 수 있고, cd 명령으로 레지스트리 키 사이를 이동할 수 있습니다.

PS C:\> cd HKLM:
PS HKLM:\> dir
PS HKLM:\> cd SYSTEM

레지스트리의 값을 읽으려면 Get-ItemProperty, 값을 쓰려면 Set-ItemProperty를 사용합니다.

PS HKLM:\> Get-ItemProperty SOFTWARE\Microsoft\Windows\CurrentVersion\Run
PS HKLM:\> Set-ItemProperty HKLM:\Example -name hello -value 1

출력 결과를 그룹화할 수 있습니다. 아래 예제는 시스템의 전체 프로세스 중에서 프로세스 이름(ProcessName)같은 것은 묶어서 출력해줍니다. |(파이프)는 각 명령을 연결해서 하나의 명령처럼 사용할 수 있도록 해줍니다.

PS C:\> Get-Process | Group-Object ProcessName

Format-List를 이용하면 속성을 선택적으로 출력할 수 있습니다. 아래 예제에서는 powershell 프로세스가 로드한 DLL(Modules)과 프로세스내의 핸들을 출력해줍니다. 모든 속성을 출력하려면 *를 사용하면 됩니다.

PS C:\> Get-Process powershell | Format-List Modules, Handles
PS C:\> Get-Process powershell | Format-List *

Sort-Object를 이용하여 출력 결과를 정렬할 수 있습니다. 아래 예제는 시스템의 모든 프로세스를 프로세스 ID가 작은 순서대로 정렬하여 출력합니다. -descending 옵션을 사용하면 프로세스 ID가 큰 순서대로 정렬하여 출력합니다.

PS C:\> Get-Process | Sort-Object Id
PS C:\> Get-Process | Sort-Object Id -descending

텍스트 파일의 내용을 읽어오려면 Get-Content를 사용합니다. Get-Content에 텍스트 파일 경로를 지정하여 사용합니다.

PS C:\> Get-Content C:\example.txt

변수의 내용을 텍스트 파일로 저장하려면 Set-Content를 사용합니다. $text라는 변수에 "Hello PowerShell"이라는 내용을 대입한 뒤 Set-Content로 변수의 내용을 파일에 저장할 수 있습니다.

PS C:\> $text = "Hello PowerShell"
PS C:\> Set-Content C:\hello.txt $text

Get-Content는 텍스트 형식 뿐만 아니라 XML 형태의 문서도 읽어올 수 있습니다. XML 문서를 XML 변수로 저장한 다음 각 엘리먼트를 손쉽게 참조할 수 있습니다. 즉 아래와 같이 XML 문서가 있습니다.

C:\hello.xml
<?xml version="1.0" ?>
<example>PowerShell</example>

이제 Get-Content로 XML 파일의 내용일 읽어 변수에 저장합니다. 여기서 중요한 것은 $hello라는 변수 앞에 [xml]이라고 변수 형태를 지정했다는 것입니다. 이렇게 변수가 XML 형태로 되어 있으면 해당 XML의 각 엘리먼트를 C 언어에서 구조체를 참조하듯이 참조할 수 있습니다. 아래 예제에서는 hello.xml의 <example> 엘리먼트를 $hello.example과 같이 참조하고 있습니다.

PS C:\> [xml]$hello = Get-Content C:\hello.xml
PS C:\> echo $hello.example
PowerShell

앞서 살펴본 [xml] 이외에도 변수를 [int], [string]처럼 정수형, 문자열형 형태로 지정할 수 있습니다. 아래 예제에서처럼 $value에 "1"이라고 문자열을 대입했지만 [int]로 지정하였기 때문에 정수형이 되고 1을 더하면 2가 됩니다.

PS C:\> [int]$value = "1"
PS C:\> $value + 1
2

이번에는 [string]을 사용하여 $value 변수를 문자열 형태로 지정하였습니다. 그래서 문자열 "1"에 1을 붙였기 때문에 11이 됩니다.

PS C:\> [string]$value = "1"
PS C:\> $value + 1
11

COM 형태의 메서드도 호출하여 사용할 수 있습니다. 아래 예제에서는 변수 $ie에 인터넷 익스플로러의 Object를 생성하고 사용할 수 있는 메서드 목록을 출력합니다. 그리고 Navigate 메서드를 사용하여 인터넷 익스플로러를 실행합니다.

PS C:\> $ie = New-Object -ComObject "InternetExplorer.Application"
PS C:\> $ie | Get-Member -MemberType Method
PS C:\> $ie.Navigate("http://www.pyrasis.com")
PS C:\> $ie.Visible = $true

WMI는 WMIC.exe(Windows Management Infrastructure Console)을 사용했었는데 PowerShell에서는 직접 사용할 수 있습니다.

PS C:\> Get-WmiObject Win32_Processor
PS C:\> Get-WmiObject Win32_BIOS
PS C:\> Get-WmiObject Win32_PhysicalMemory

PowerShell 스크립트 문법

PowerShell의 문법은 지금까지 독자들이 사용해왔던 프로그래밍 언어, 유닉스 쉘 스크립트와 비슷합니다.

  • 변수
    변수는 Perl, PHP, 유닉스 쉘 스크립트와 같이 $를 사용합니다. 변수 이름은 영문 및 한글을 지원하며 숫자로만 된 이름도 가능합니다. 변수에 값을 대입할 때에는 =을 사용하며 문자열을 대입할 때에는 " " 따옴표를 사용해야 합니다. 변수 앞에 [int], [char], [string], [xml] 등을 사용하여 변수 형태를 강제로 지정해줄 수 있습니다.
$hello = 1
$world = "1"
$1234 = "hi"
$변수 = 123
[int]$hello = "123"
[string]$hello = 123
  • 배열
    배열은 @로 표현합니다. 단 배열을 저장할 때는 변수에 저장해야 하며, 아래 예제와 같이 $array[0], $array[1][1]처럼 참조하면 됩니다.
$array = @(1,2,3,4)
echo $array[0]
1
$array = @((1,2,3,4),(5,6,7,8))
echo $array[1][1]
6
  • 산술 연산자
    산술 연산자는 기존의 프로그래밍 언어와 사용 방법이 거의 똑같습니다. + 더하기 및 연결, - 빼기, * 곱하기 및 문자열 반복, / 나누기, % 몫입니다.
$a + $b
$a - $b
$a * $b
$a / $b
$a % $b
  • 증감 연산자
    증감 연산자도 기존의 프로그래밍 언어와 사용방법이 거의 똑같습니다. ++ 1 증가, -- 1 감소. 중요한 것은 다른 프로그래밍 언어들과 마찬가지로 이 증감 연산자가 변수 앞에 붙는지 변수 뒤에 붙는지에 따라 효과가 달라집니다.
$a = 1
$b = $a++
echo $b
1
$a = 1
$b = ++$a
echo $b
2
  • 할당 연산자 할당 연산자는 = 대입, += 더한 뒤 대입, -= 뺀 뒤 대입, /= 나눈 뒤 대입, %= 몫을 구한 뒤 대입이 있습니다.
$a += $b
$a -= $b
$a *= $b
$a /= $b
$a %= $b
  • 주석
    주석은 Perl, PHP, 유닉스 쉘 스크립트와 마찬가지로 #을 사용합니다. 스크립트에서 줄의 맨 앞에 #이 있으면 그 줄 전체가 주석이 되며, 변수나 cmdlet이 있으면서 그 뒤에 #이 오면 #뒤에오는 부분이 주석이 됩니다.
# 예제 주석
$ hello = "안녕하세요" # 변수에 안녕하세요를 대입

여러 줄을 주석으로 만들려면 <# #>를 사용하면 됩니다.

<#
Get-Item C:\
Get-Process
#>
Write-Host "hello"
  • 비교 연산자
    PowerShell에서 비교 연산자는 다른 프로그래밍 언어나 쉘 스크립트와는 조금 다릅니다. 일반적으로 <, >를 사용하여 비교하지만 PowerShell에서는 >리다이렉션으로 사용하기 때문에 <, >를 사용하지 않고 -eq(같음, =), -ne(같지 않음, !=), -gt(보다 큼, >), -ge(보다 크거나 같음, >=), -lt(보다 작음, <), -le(보다 작거나 같음, <=)를 사용합니다.
1 -eq 2
if ($a -lt $b) { echo $a }
  • 조건문
    조건문은 기존의 프로그래밍 언어와 거의 같습니다. 단 조건문을 사용할 때 비교 연산자는 <, > 등을 사용하는 것이 아닌 위에서 설명한 -lt, -gt 등을 사용해야 합니다.
if ($a -lt $b)
{
    echo $a
}
elseif ($a -eq $b)
{
    echo $b
}
else
{
    echo $a
}
  • 반복문
    반복문 또한 기존 프로그래밍 언어와 사용법이 거의 같습니다. for, foreach, while, do while, do until (continue, break)를 사용할 수 있습니다. forfor (초기화, 조건, 반복) 형태로 사용합니다.
for ($i = 0; $i -lt 5; $i++)
{
    echo $i
}

foreachforeach ($a in $b) 형태로 사용하는데 $b는 배열 형태가 되어야 합니다. $b 배열안에 든 내용을 순서대로 $a에 대입하면서 반복하게 됩니다. $b 배열안에 든 데이터의 개수만큼 반복합니다.

$b = 1, 2, 3, 4, 5
foreach ($a in $b)
{
    echo $a
}

whilewhile (조건) 형태로 사용합니다. while은 조건이 참인 동안 반복합니다.

$a = 1
while ($a -lt 10)
{
    echo $a
    $a++
}

do whiledo { } while (조건) 형태로 사용하고, do untildo {} until (조건) 형태로 사용합니다. do while은 조건이 참인 동안 반복하지만 do until은 조건이 참이 될 때까지 반복합니다.

$a = 1
do
{
    echo $a
    $a++
}
while ($a -lt 10)
$a = 1
do
{
    echo $a
    $a++
}
until ($a -gt 10)

continuebreak는 조건문과 함께 사용됩니다. continue는 continue 이하 코드는 건너뛰고 루프를 다시 반복하며, break는 루프를 멈출 때 사용합니다.

while (1)
{
    if ($a -lt 10)
        continue
}
while (1)
{
    if ($a -gt 10)
        break
}
  • 분기문
    PowerShell에서 분기문은 다른 프로그래밍 언어와 마찬가지로 switch이며 switch (변수) 형태로 사용합니다.
switch ($a)
{
    "1" { echo 1 }
    "2" { echo 2 }
    default { echo 0 }
}
  • 논리 연산자
    대부분의 프로그래밍 언어나 쉘 스크립트에서는 논리 연산자로 &|를 사용합니다. 하지만 PowerShell에서는 !, -not(반대), -and(그리고), -or(또는)을 사용합니다.
if (($a -eq 1) -and ($b -eq 2))
{
    echo $a
}
  • 함수
    함수를 만들려면 function을 사용합니다. function 함수명 형태로 사용하며, 함수를 호출하려면 함수 이름 그대로 입력해주면 됩니다. 함수의 매개변수는 공백으로 구분합니다.
function MyFunction
{
    echo "MyFunction"
    echo $args[0]
}

MyFunction 1

TIP
PowerShell 명령행을 실행한 상태에서 조건문, 반복문, 분기문 함수는 해당 구문을 한 줄로 작성하면 간단하게 실행할 수 있습니다. 예를 들어 조건문을 사용하려면 if () 뒤에 따라오는 {}는 같은 줄에 있어야 합니다. 여러 줄로 작성하였다면 해당 구문이 끝난 다음 맨 마지막 빈줄에서 엔터를 입력하면 함수가 실행됩니다. 아래 예제와 같이 echo $aecho $b를 한 줄로 표현하려면 ;(세미콜론)으로 구분해주면 됩니다.

if ($a -lt $b) { echo $a; echo $b }

단 스크립트 파일 안에서 조건문을 사용했을 때에는 if ( ) 뒤에 따라오는 { }가 같은 줄에 있지 않아도 됩니다.

if ($a -lt $b)
{
    echo $a
    echo $b
}
  • 스크립트 및 함수의 매개변수
    스크립트 파일 및 함수의 매개변수는 $args 변수안에 저장됩니다. $args[0]은 첫 번째 매개변수이며 $args[1]은 두 번째 매개변수가 됩니다. 아래 내용을 hello.ps1로 저장합니다.
hello.ps1
echo $args[0]
echo $args[1]

hello.ps1 hello world 처럼 helloworld를 매개변수로 지정해주면 다음과 같이 hello와 world가 출력되게 됩니다.

.\hello.ps1 hello world
hello
world

함수의 매개변수도 마찬가지입니다. 아래 함수를 실행하면 hello와 world가 출력돕니다.

function HelloFunction
{
    echo $args[0]
    echo $args[1]
}

HelloFunction hello world
  • 스크립트 및 함수의 반환값(리턴값)
    return으로 함수의 반환값을 지정할 수 있으며 스크립트 파일 자체의 반환값도 return으로 지정할 수 있습니다. 아래 예제에서 HelloFunction 함수를 실행하면 $a에 HelloFunction의 반환값인 100이 대입됩니다.
function HelloFunction
{
    return 100
}

$a = HelloFunction

이번에는 스크립트 파일의 반환값을 알아보겠습니다. 다음 내용을 hello.ps1로 저장합니다.

hello.ps1
return 100

그리고 PowerShell 명령행이나 스크립트 파일에서 다음과 같이 hello.ps1을 실행하면 $a에 hello.ps1의 반환값인 100이 대입됩니다.

$a = hello.ps1
  • 스크립트 블록
    PowerShell에서는 cmdlet을 변수에 저장한 뒤 해당 변수를 실행할 수 있습니다. cmdlet을 변수에 저장할 때에는 { }를 사용하며 각 요소를 구분할 때에는 ;(세미콜론)을 사용합니다. cmdlet이 저장된 변수를 실행하려면 변수 이름 앞에 &를 붙여주면 됩니다.
$hello = { Get-Process; echo 1 }
&$hello

다음은 PowerShell 문법을 간단하게 표로 정리한 것입니다.

항목문법예제
변수$$hello
배열@@(2), $a[2][3]
산술 연산자+(더하기, 연결), -(빼기),
*(곱하기, 문자열 반복), /(나누기), %(몫)
$a + $b
증감 연산자++(1 증가), --(1 감소)$a++, $b--
할당 연산자=, +=, -=, *=, /=, %=$a += $b
주석## Hello World
비교 연산자-eq(같음, =), -ne(같지 않음, !=),
-gt(보다 큼, >), -ge(보다 크거나 같음, >=),
-lt(보다 작음, <), -le(보다 작거나 같음, <=)
if ($a -lt 10)
조건문if, elseif, elseif ($a -eq 10)
반복문for, foreach, while,
do while, do until (continue, break)
for ($i = 0; $i –lt 5; $i++) { }
foreach ($a in $b) { }
while ($i -ne 10) { }
do { } while ($i -ne 10)
do { } until ($i -ne 10)
분기문switchswitch ($a)
{
    "1" { echo 1 }
    "2" { echo 2 }
    default { echo 0 }
}
논리 연산자!, -not, -and, -orif (!$a)
함수functionfunction MyFunction
{
    echo "Hello"
}
스크립트 및 함수의 매개변수$args$args[0] $args[1]
스크립트 및 함수의 반환값(리턴값)returnreturn $a
스크립트 블록&$hello = { Get-Process; echo 1; }
&$hello

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.