about_Scripts

간단한 설명

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

자세한 설명

스크립트는 하나 이상의 PowerShell 명령을 포함하는 일반 텍스트 파일입니다. PowerShell 스크립트에는 파일 확장명이 있습니다 .ps1 .

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

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

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

스크립트를 실행하는 방법

Windows에서 스크립트를 실행하려면 기본 PowerShell 실행 정책을 변경해야 합니다. 실행 정책은 Windows가 아닌 플랫폼에서 실행되는 PowerShell에는 적용되지 않습니다.

기본 실행 정책인 Restricted는 로컬 컴퓨터에서 작성하는 스크립트를 포함하여 모든 스크립트가 실행되지 않도록 합니다. 자세한 내용은 about_Execution_Policies를 참조하세요.

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

실행 정책을 변경하려면 다음 절차를 사용합니다.

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

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

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

PowerShell을 사용하여 실행

PowerShell 3.0부터 파일 탐색기 스크립트를 실행할 수 있습니다.

"PowerShell로 실행" 기능을 사용하려면 다음을 수행합니다.

파일 탐색기 실행하고 스크립트 파일 이름을 마우스 오른쪽 단추로 클릭한 다음 "PowerShell로 실행"을 선택합니다.

"PowerShell을 사용하여 실행" 기능은 필수 매개 변수가 없으며 명령 프롬프트에 출력을 반환하지 않는 스크립트를 실행하도록 설계되었습니다.

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

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

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

스크립트의 경로와 파일 이름을 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 루프와 같은 파이프라인, 함수 및 제어 구조를 사용하는 명령, 단일 명령을 비롯한 유효한 PowerShell 명령이 포함될 수 있습니다.

스크립트를 작성하려면 텍스트 편집기에서 새 파일을 열고, 명령을 입력하고, 파일 확장명을 가진 유효한 파일 이름을 .ps1 가진 파일에 저장합니다.

다음 예제는 현재 시스템에서 실행 중인 서비스를 가져와서 로그 파일에 저장하는 간단한 스크립트입니다. 로그 파일 이름은 현재 날짜에서 만들어집니다.

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

이 스크립트를 만들려면 텍스트 편집기 또는 스크립트 편집기를 열고 다음 명령을 입력한 다음, 이름이 지정된 ServiceLog.ps1파일에 저장합니다.

스크립트의 매개 변수

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

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

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

다음 예제에서는 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_Functionsabout_Functions_Advanced_Parameters 참조하세요.

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

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

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

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

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

    cmdlet에 대해 일반적으로 만들어지는 형식과 같은 XML 기반 도움말 항목을 만듭니다. 도움말 항목을 여러 언어로 번역하는 경우 XML 기반 도움말이 필요합니다.

스크립트를 XML 기반 도움말 항목과 연결하려면 다음을 사용합니다. ExternalHelp 도움말 주석 키워드(keyword). ExternalHelp 키워드(keyword) 대한 자세한 내용은 about_Comment_Based_Help 참조하세요. XML 기반 도움말에 대한 자세한 내용은 Cmdlet 도움말을 작성하는 방법을 참조 하세요.

종료 값 반환

기본적으로 스크립트는 스크립트가 종료되면 종료 상태 반환하지 않습니다. 스크립트에서 종료 코드를 반환하려면 이 문을 사용해야 exit 합니다. 기본적으로 이 문은 .를 exit 반환합니다 0. 다른 종료 상태 반환하는 숫자 값을 제공할 수 있습니다. 0이 아닌 종료 코드는 일반적으로 오류를 신호로 표시합니다.

Windows에서는 허용된 [int]::MaxValue 번호와 사이의 [int]::MinValue 모든 번호가 허용됩니다.

Unix에서는 (0)과 [byte]::MaxValue (255) 사이의 [byte]::MinValue 양수만 허용됩니다. 범위 -255-1 음수는 256을 추가하여 자동으로 양수로 변환됩니다. 예를 들어 . -2254

PowerShell에서 이 문은 exit 변수의 $LASTEXITCODE 값을 설정합니다. cmd.exe(Windows Command Shell)에서 exit 문은 환경 변수의 %ERRORLEVEL% 값을 설정합니다.

숫자가 아니거나 플랫폼별 범위를 벗어난 인수는 값으로 0변환됩니다.

스크립트 범위 및 점 소싱

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

다른 범위에서 스크립트를 실행하려면 전역 또는 로컬과 같은 범위를 지정하거나 스크립트의 원본을 점 지정할 수 있습니다.

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

스크립트 원본을 점 지정하려면 스크립트 경로 앞에 점(.) 및 공백을 입력합니다.

예시:

. C:\scripts\UtilityFunctions.ps1

또는

. .\UtilityFunctions.ps1

스크립트가 UtilityFunctions.ps1 실행되면 스크립트에서 만드는 함수와 변수가 현재 범위에 추가됩니다.

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

#In UtilityFunctions.ps1

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

  if (test-path $profile)
    {write-error "Profile $profileName already exists 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 참조하세요.

모듈의 스크립트

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

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

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

기타 스크립트 기능

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

  • #Requires - 문을 사용하여 #Requires 지정된 모듈이나 스냅인 및 지정된 버전의 PowerShell 없이 스크립트가 실행되지 않도록 할 수 있습니다. 자세한 내용은 about_Requires 참조하세요.

  • $PSCommandPath - 실행 중인 스크립트의 전체 경로와 이름을 포함합니다. 이 매개 변수는 모든 스크립트에서 유효합니다. 이 자동 변수는 PowerShell 3.0에서 도입되었습니다.

  • $PSScriptRoot - 스크립트가 실행되는 디렉터리를 포함합니다. PowerShell 2.0에서 이 변수는 스크립트 모듈(.psm1)에서만 유효합니다. PowerShell 3.0부터 모든 스크립트에서 유효합니다.

  • $MyInvocation - 자동 변수에는 $MyInvocation 현재 스크립트에 대한 정보(시작 방법 또는 "호출됨"에 대한 정보 포함)가 포함됩니다. 이 변수와 해당 속성을 사용하여 스크립트가 실행되는 동안 스크립트에 대한 정보를 가져올 수 있습니다. 예를 들어 . $MyInvocation MyCommand.Path 변수에는 스크립트의 경로와 파일 이름이 포함됩니다. $MyInvocation. 줄에는 모든 매개 변수 및 값을 포함하여 스크립트를 시작한 명령이 포함됩니다.

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

    • PSCommandPath 에는 현재 스크립트를 호출하거나 호출한 스크립트의 전체 경로와 이름이 포함됩니다.

    • PSScriptRoot 에는 현재 스크립트를 호출하거나 호출한 스크립트의 디렉터리가 포함되어 있습니다.

    현재 스크립트에 $PSCommandPath 대한 정보를 포함하는 자동 변수와 $PSScriptRoot 달리 변수$MyInvocation PSCommandPathPSScriptRoot 속성에는 현재 스크립트를 호출한 스크립트에 대한 정보가 포함됩니다.

  • 데이터 섹션 - 키워드(keyword) 사용하여 스크립트의 Data 논리와 데이터를 구분할 수 있습니다. 데이터 섹션은 지역화를 더 쉽게 만들 수도 있습니다. 자세한 내용은 about_Data_Sectionsabout_Script_Internationalization 참조하세요.

  • 스크립트 서명 - 스크립트에 디지털 서명을 추가할 수 있습니다. 실행 정책에 따라 디지털 서명을 사용하여 안전하지 않은 명령을 포함할 수 있는 스크립트 실행을 제한할 수 있습니다. 자세한 내용은 about_Execution_Policiesabout_Signing 참조하세요.

참고 항목