about_Scripts

업데이트 날짜: 2012년 8월

적용 대상: Windows PowerShell 2.0, Windows PowerShell 3.0

항목

about_Scripts

간단한 설명

Windows PowerShell®에서 스크립트를 실행 및 작성하는 방법을 설명합니다.

자세한 설명

스크립트는 하나 이상의 Windows PowerShell 명령이 포함된 일반 텍스트 파일입니다. Windows PowerShell 스크립트의 파일 이름 확장명은 .ps1입니다.

스크립트 실행은 cmdlet 실행과 거의 같습니다. 스크립트의 경로 및 파일 이름을 입력하고 매개 변수를 사용하여 데이터를 전송하고 옵션을 설정합니다. 다른 컴퓨터의 원격 세션 또는 사용 중인 컴퓨터에서 스크립트를 실행할 수 있습니다.

스크립트를 작성하면 나중에 사용하도록 명령이 저장되고 다른 사용자와 쉽게 공유할 수 있습니다. 가장 중요한 것은 스크립트 경로 및 파일 이름을 입력하면 명령을 실행할 수 있다는 점입니다. 스크립트는 파일의 단일 명령처럼 간단하거나 복잡한 프로그램처럼 광범위할 수 있습니다.

스크립트에는 #Requires 특수 주석, 매개 변수 사용, 데이터 섹션 지원, 보안용 디지털 서명 등의 추가 기능이 있습니다. 스크립트 및 스크립트의 함수에 대한 도움말 항목을 작성할 수도 있습니다.

스크립트를 실행하는 방법

스크립트를 실행하기 전에 기본 Windows PowerShell 실행 정책을 변경해야 합니다. 기본 실행 정책 "Restricted"는 로컬 컴퓨터에서 작성한 스크립트를 포함하여 모든 스크립트를 실행하지 않도록 차단합니다. 자세한 내용은 about_Execution_Policies를 참조하세요.

실행 정책은 레지스트리에 저장되므로 각 컴퓨터에서 한 번만 변경해야 합니다.

실행 정책을 변경하려면 다음 절차를 따릅니다.

  • 1. "관리자 권한으로 실행" 옵션을 사용하여 Windows PowerShell을 시작합니다.

  • 2. 명령 프롬프트에 다음을 입력합니다.

                Set-ExecutionPolicy AllSigned
    

    또는

                Set-ExecutionPolicy RemoteSigned
    

변경이 즉시 적용됩니다.

스크립트를 실행하려면 스크립트 파일의 전체 이름 및 전체 경로를 입력합니다. 여기에 섹션 본문을 삽입합니다.

예를 들어 C:\Scripts 디렉터리에서 Get-ServiceLog.ps1 스크립트를 실행하려면 다음을 입력합니다.

        C:\Scripts\Get-ServiceLog.ps1

현재 디렉터리에서 스크립트를 실행하려면 현재 디렉터리의 경로를 입력하거나 현재 디렉터리를 나타내는 점을 사용하고 뒤에 경로 백슬래시(.\)를 추가합니다.

예를 들어 로컬 디렉터리에서 ServicesLog.ps1 스크립트를 실행하려면 다음을 입력합니다.

        .\Get-ServiceLog.ps1

스크립트에 매개 변수가 있으면 스크립트 파일 이름 뒤에 매개 변수 및 매개 변수 값을 입력합니다.

예를 들어 다음 명령은 Get-ServiceLog 스크립트의 ServiceName 매개 변수를 사용하여 WinRM 서비스 활동 로그를 요청합니다.

        .\Get-ServiceLog.ps1 -ServiceName WinRM

보안 기능에 따라 Windows PowerShell에서는 파일 탐색기에서 스크립트 아이콘을 두 번 클릭하거나 스크립트가 현재 디렉터리에 있더라도 전체 경로 없이 스크립트 이름을 입력할 경우 스크립트를 실행하지 않습니다. Windows PowerShell에서 명령 및 스크립트를 실행하는 방법에 대한 자세한 내용은 about_Command_Precedence를 참조하세요.

POWERSHELL에서 실행

Windows PowerShell 3.0부터 파일 탐색기 또는 이전 Windows 버전의 Windows 탐색기에서 스크립트를 실행할 수 있습니다.

"PowerShell에서 실행" 기능을 사용하려면

파일 탐색기(또는 Windows 탐색기)에서 스크립트 파일 이름을 마우스 오른쪽 단추로 클릭하고 "PowerShell에서 실행"을 선택합니다.

"PowerShell에서 실행" 기능은 필수 매개 변수가 없고 명령 프롬프트에 대한 출력을 반환하지 않는 스크립트를 실행하도록 디자인되었습니다.

자세한 내용은 about_Run_With_PowerShell을 참조하세요.

다른 컴퓨터에서 스크립트 실행

한 대 이상의 원격 컴퓨터에서 스크립트를 실행하려면 Invoke-Command cmdlet의 FilePath 매개 변수를 사용합니다.

FilePath 매개 변수 값으로 스크립트의 경로 및 파일 이름을 입력합니다. 스크립트는 로컬 컴퓨터나 로컬 컴퓨터에서 액세스할 수 있는 디렉터리에 있어야 합니다.

다음 명령은 Server01 및 Server02 원격 컴퓨터에서 Get-ServiceLog.ps1 스크립트를 실행합니다.

        Invoke-Command -ComputerName Server01, Server02 -FilePath C:\Scripts\Get-ServiceLog.ps1

스크립트에 대한 도움말 가져오기

Get-Help cmdlet은 스크립트 및 cmdlet과 기타 명령 형식에 대한 도움말 항목을 가져옵니다. 스크립트에 대한 도움말 항목을 가져오려면 "Get-Help"를 입력하고 뒤에 스크립트의 경로 및 파일 이름을 추가합니다. 스크립트 경로가 Path 환경 변수에 포함되면 경로를 생략할 수 있습니다.

예를 들어 ServicesLog.ps1 스크립트에 대한 도움말을 가져오려면 다음을 입력합니다.

        get-help C:\admin\scripts\ServicesLog.ps1

스크립트를 작성하는 방법

스크립트에는 단일 명령, 파이프라인 사용 명령, 함수, 제어 구문(예: If 문 및 For 루프)을 포함한 유효한 Windows PowerShell 명령을 포함할 수 있습니다.

스크립트를 작성하려면 텍스트 편집기(예: 메모장) 또는 스크립트 편집기(예: Windows PowerShell ISE(통합 스크립팅 환경))를 시작합니다. 명령을 입력하고 유효한 파일 이름 및 .ps1 파일 이름 확장명을 사용하여 파일에 저장합니다.

다음 예제는 현재 시스템에서 실행 중인 서비스를 가져오고 로그 파일에 저장하는 간단한 스크립트입니다. 로그 파일 이름은 현재 날짜를 기반으로 생성됩니다.

        $date = (get-date).dayofyear
        get-service | out-file "$date.log"

이 스크립트를 만들려면 텍스트 편집기나 스크립트 편집기를 열고, 이들 명령을 입력하고, ServiceLog.ps1 파일에 저장합니다.

스크립트의 매개 변수

스크립트에서 매개 변수를 정의하려면 Param 문을 사용합니다. Param 문은 주석과 #Requires 문을 제외하고 스크립트에서 첫 번째 문이어야 합니다.

스크립트 매개 변수는 함수 매개 변수처럼 작동합니다. 매개 변수 값은 스크립트의 모든 명령에 사용할 수 있습니다. Parameter 특성 및 해당 명명된 인수를 포함하여 함수 매개 변수의 모든 기능도 스크립트에서 유효합니다.

스크립트를 실행할 때 스크립트 사용자는 스크립트 이름 뒤에 매개 변수를 입력합니다.

다음 예제에서는 ComputerName 매개 변수가 있는 Test-Remote.ps1 스크립트를 보여 줍니다. 두 스크립트 함수가 모두 ComputerName 매개 변수 값에 액세스할 수 있습니다.

        param ($ComputerName = $(throw "ComputerName parameter is required."))

        function CanPing {
           $error.clear()
           $tmp = test-connection $computername -erroraction SilentlyContinue

           if (!$?) 
               {write-host "Ping failed: $ComputerName."; return $false}
           else
               {write-host "Ping succeeded: $ComputerName"; return $true}
        }

        function CanRemote {
            $s = new-pssession $computername -erroraction SilentlyContinue

            if ($s -is [System.Management.Automation.Runspaces.PSSession])
                {write-host "Remote test succeeded: $ComputerName."}
            else
                {write-host "Remote test failed: $ComputerName."}
        }

        if (CanPing $computername) {CanRemote $computername}

이 스크립트를 실행하려면 스크립트 이름 뒤에 매개 변수 이름을 입력합니다. 예를 들면 다음과 같습니다.

        C:\PS> .\test-remote.ps1 -computername Server01

        Ping succeeded: Server01
        Remote test failed: Server01

Param 문 및 함수 매개 변수에 대한 자세한 내용은 about_Functions 및 about_Functions_Advanced_Parameters를 참조하세요.

스크립트에 대한 도움말 작성

다음 두 방법의 하나를 사용하여 스크립트에 대한 도움말 항목을 작성할 수 있습니다.

  • -- 스크립트에 대한 주석 기반 도움말

    주석에서 특수 키워드를 사용하여 도움말 항목을 만듭니다. 스크립트에 대한 주석 기반 도움말을 만들려면 스크립트 파일의 시작 또는 끝 부분에 주석을 배치해야 합니다. 주석 기반 도움말에 대한 자세한 내용은 about_Comment_Based_Help를 참조하세요.

  • -- 스크립트에 대한 XML 기반 도움말

    일반적으로 cmdlet에 대한 형식을 만드는 것처럼 XML 기반 도움말 항목을 만듭니다. 도움말 항목을 여러 언어로 번역할 경우 XML 기반 도움말이 필요합니다.

    스크립트를 XML 기반 도움말 항목과 연결하려면 .ExternalHelp 도움말 주석 키워드를 사용합니다. ExternalHelp 키워드에 대한 자세한 내용은 about_Comment_Based_Help를 참조하세요. XML 기반 도움말에 대한 자세한 내용은 MSDN(Microsoft Developer Network) Library에서 "Cmdlet 도움말을 작성하는 방법"(https://go.microsoft.com/fwlink/?LinkID=123415)(영문)을 참조하세요.

스크립트 범위 및 도트 소싱

각 스크립트는 자체 범위에서 실행됩니다. 스크립트에서 만든 함수, 변수, 별칭 및 드라이브는 스크립트 범위에서만 존재합니다. 스크립트가 실행되는 범위에 있는 항목이나 해당 값에 액세스할 수 없습니다.

스크립트를 다른 범위에서 실행하려면 전역 또는 로컬 등의 범위를 지정하거나 스크립트를 도트 소싱할 수 있습니다. 여기에 섹션 본문을 삽입합니다.

도트 소싱 기능을 통해 스크립트 범위 대신 현재 범위에서 스크립트를 실행할 수 있습니다. 도트 소싱된 스크립트를 실행하면 스크립트의 명령은 명령 프롬프트에서 입력한 것처럼 실행됩니다. 스크립트에서 만든 함수, 변수, 별칭 및 드라이브는 작업 중인 범위에서 생성됩니다. 스크립트가 실행되고 나면 생성된 항목을 사용하여 사용 중인 세션에서 해당 값에 액세스할 수 있습니다.

스크립트를 도트 소싱하려면 스크립트 경로 앞에 점(.) 및 공백을 입력합니다.

예를 들면 다음과 같습니다.

        . C:\scripts\UtilityFunctions.ps1

또는

        . .\UtilityFunctions.ps1

UtilityFunctions 스크립트가 실행되고 나면 스크립트에서 만든 함수 및 변수가 현재 범위에 추가됩니다.

예를 들어 UtilityFunctions.ps1 스크립트는 New-Profile 함수 및 $ProfileName 변수를 만듭니다.

        #In UtilityFunctions.ps1

        function New-Profile
        {
            Write-Host "Running New-Profile function"
            $profileName = split-path $profile -leaf

            if (test-path $profile)
               {write-error "There is already a $profileName profile on this computer."}
            else
       {new-item -type file -path $profile -force }
        }

UtilityFunctions.ps1 스크립트를 자체 스크립트 범위에서 실행하면 New-Profile 함수와 $ProfileName 변수는 스크립트가 실행되는 동안에만 존재합니다. 스크립트가 존재하면 다음 예제와 같이 함수와 변수가 제거됩니다.

        C:\PS> .\UtilityFunctions.ps1

        C:\PS> New-Profile
        The term 'new-profile' is not recognized as a cmdlet, function, operable
        program, or script file. Verify the term and try again.
        At line:1 char:12
        + new-profile <<<< 
           + CategoryInfo          : ObjectNotFound: (new-profile:String) [], 
           + FullyQualifiedErrorId : CommandNotFoundException

        C:\PS> $profileName
        C:\PS>

스크립트를 도트 소싱하고 실행하면 스크립트는 사용 중인 범위의 사용 중인 세션에서 New-Profile 함수와 $ProfileName 변수를 만듭니다. 스크립트가 실행되고 나면 다음 예제와 같이 사용 중인 세션에서 New-Profile 함수를 사용할 수 있습니다.

        C:\PS> . .\UtilityFunctions.ps1

        C:\PS> New-Profile


            Directory: C:\Users\juneb\Documents\WindowsPowerShell


            Mode    LastWriteTime     Length Name                                                                   
            ----    -------------     ------ ----                                                                   
            -a---   1/14/2009 3:08 PM      0 Microsoft.PowerShellISE_profile.ps1                                    


        C:\PS> $profileName
        Microsoft.PowerShellISE_profile.ps1

범위에 대한 자세한 내용은 about_Scopes를 참조하세요.

모듈의 스크립트

모듈은 단위로 배포할 수 있는 관련 Windows PowerShell 리소스 집합입니다. 모듈을 사용하여 스크립트, 함수 및 기타 리소스를 구성할 수 있습니다. 모듈을 사용하여 코드를 다른 사용자에게 배포하고 신뢰할 수 있는 출처에서 코드를 가져올 수도 있습니다.

스크립트를 모듈에 포함하거나 전체적으로 또는 주로 스크립트와 지원 리소스로 구성된 스크립트 모듈을 만들 수 있습니다. 스크립트 모듈은 .psm1 파일 이름 확장명을 가진 스크립트입니다.

모듈에 대한 자세한 내용은 about_Modules를 참조하세요.

기타 스크립트 기능

Windows PowerShell에는 스크립트에서 사용할 수 있는 많은 유용한 기능이 있습니다.

  • #Requires
    #Requires 문을 사용하여 지정된 모듈이나 스냅인 및 지정된 Windows PowerShell 버전이 없으면 스크립트가 실행되지 않게 할 수 있습니다. 자세한 내용은 about_Requires를 참조하세요.
  • $PSCommandPath
    실행 중인 스크립트의 전체 경로와 이름을 포함합니다. 이 매개 변수는 모든 스크립트에서 유효합니다. 이 자동 변수는 Windows PowerShell 3.0에 도입되었습니다.
  • $PSScriptRoot
    스크립트가 실행된 원본 디렉터리를 포함합니다. Windows PowerShell 2.0에서 이 변수는 스크립트 모듈(.psm1)에서만 유효합니다. Windows PowerShell 3.0부터는 모든 스크립트에서 유효합니다.
  • $MyInvocation
    $MyInvocation 자동 변수는 시작 또는 "호출" 방법에 대한 정보를 포함하여 현재 스크립트에 대한 정보를 포함합니다. 이 변수와 해당 속성을 사용하여 스크립트가 실행되는 동안 스크립트에 대한 정보를 가져올 수 있습니다. 예를 들어 $MyInvocation.MyCommand.Path 변수는 스크립트의 경로 및 파일 이름을 포함합니다. $MyInvocation.Line은 모든 매개 변수와 값을 비롯하여 스크립트를 시작한 명령을 포함합니다.

    Windows PowerShell 3.0부터 $MyInvocation에는 현재 스크립트를 호출한 스크립트에 대한 정보를 제공하는 두 가지 새로운 속성이 있습니다. 이들 속성 값은 호출자가 스크립트인 경우에만 채워집니다.

    • -- PSCommandPath는 현재 스크립트를 호출한 스크립트의 전체 경로 및 이름을 포함합니다.

    • -- PSScriptRoot는 현재 스크립트를 호출한 스크립트의 디렉터리를 포함합니다.

    현재 스크립트에 대한 정보가 포함된 $PSCommandPath 및 $PSScriptRoot 자동 변수와 달리 $MyInvocation 변수의 PSCommandPath 및 PSScriptRoot 속성은 현재 스크립트를 호출한 스크립트에 대한 정보를 포함합니다.

  • Data 섹션
    Data 키워드를 사용하여 스크립트에서 데이터와 논리를 구분할 수 있습니다. Data 섹션을 사용하여 더 쉽게 지역화할 수도 있습니다. 자세한 내용은 about_Data_Sections 및 about_Script_Localization을 참조하세요.
  • 스크립트 서명
    스크립트에 디지털 서명을 추가할 수 있습니다. 실행 정책에 따라 디지털 서명을 사용하여 안전하지 않은 명령이 포함될 수 있는 스크립트의 실행을 제한할 수 있습니다. 자세한 내용은 about_Execution_Policies 및 about_Signing을 참조하세요.

참고 항목

about_Command_Precedence

about_Comment_Based_Help

about_Execution_Policies

about_Functions

about_Modules

about_Profiles

about_Requires

about_Run_With_PowerShell

about_Scopes

about_Script_Blocks

about_Signing

Invoke-Command