about_Scopes

업데이트 날짜: 2012년 8월

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

항목

about_Scopes

간단한 설명

Windows PowerShell®의 범위 개념을 설명하고 요소 범위를 설정 및 변경하는 방법을 보여 줍니다.

자세한 설명

Windows PowerShell에서는 읽고 변경할 수 있는 위치를 제한하여 변수, 별칭, 함수 및 Windows PowerShell 드라이브(PSDrives)에 대한 액세스를 보호합니다. 범위에 대한 몇몇 간단한 규칙을 적용하면 Windows PowerShell에서는 변경되지 않았어야 하는 항목을 실수로 변경하지 않을 수 있습니다.

범위에 대한 기본 규칙은 다음과 같습니다.

  • - 범위에 포함하는 항목은 항목이 생성된 범위에 표시되고 항목을 명시적으로 private으로 설정하지 않으면 자식 범위에 표시됩니다. 하나 이상의 범위에서 변수, 별칭, 함수 또는 Windows PowerShell 드라이브를 배치할 수 있습니다.

  • - 다른 범위를 명시적으로 지정하지 않으면 범위 내에서 만든 항목은 항목이 생성된 범위에서만 변경할 수 있습니다.

한 범위에서 항목을 만들고 이 항목이 해당 이름을 다른 범위의 항목과 공유하면 원래 항목이 새 항목 아래에 숨겨질 수 있습니다. 하지만 재정의되거나 변경되지 않습니다.

WINDOWS POWERSHELL 범위

Windows PowerShell의 범위에는 이름 및 번호가 둘 다 포함됩니다. 명명된 범위는 절대 범위를 지정합니다. 번호는 상대적이고 범위 간 관계를 반영합니다.

  • 전역:
    Windows PowerShell이 시작될 때 적용되는 범위입니다. Windows PowerShell가 시작될 때 있는 변수와 함수는 전역 범위에서 만들어졌습니다. 여기에는 자동 변수 및 기본 설정 변수가 포함됩니다. 또한 Windows PowerShell 프로필에 포함된 변수, 별칭 및 함수가 포함됩니다.
  • 로컬:
    현재 범위입니다. 로컬 범위는 전역 범위이거나 기타 범위일 수 있습니다.
  • 스크립트:
    스크립트 파일이 실행되는 동안 생성된 범위입니다. 스크립트의 명령만 스크립트 범위에서 실행됩니다. 스크립트의 명령에 대한 스크립트 범위는 로컬 범위입니다.
  • Private:
    private 범위의 항목은 현재 범위 외부에서 볼 수 없습니다. private 범위를 사용하여 다른 범위에서 같은 이름을 가진 항목의 private 버전을 만들 수 있습니다.
  • 번호가 매겨진 범위:
    다른 범위에 대한 한 범위의 상대적 위치를 설명하는 이름 또는 번호별 범위를 참조할 수 있습니다. 범위 0은 현재 또는 로컬 범위를 나타냅니다. 범위 1은 직계 부모 범위를 나타냅니다. 범위 2는 부모 범위의 부모를 나타냅니다. 번호가 지정된 범위는 많은 재귀 범위를 만든 경우 유용합니다.

부모 및 자식 범위

스크립트 또는 함수를 실행하거나, 세션을 만들거나, Windows PowerShell의 새 인스턴스를 시작하여 새 범위를 만들 수 있습니다. 새 범위를 만들면 결과는 부모 범위(원래 범위) 및 자식 범위(직접 만든 범위)입니다.

Windows PowerShell에서 모든 범위는 전역 범위의 자식 범위이지만 여러 범위 및 여러 재귀 범위를 만들 수 있습니다.

항목을 명시적으로 private으로 설정하지 않으면 부모 범위의 항목을 자식 범위에 사용할 수 있습니다. 그러나 항목을 만들 때 범위를 명시적으로 지정하지 않으면 자식 범위에서 만들고 변경하는 항목은 부모 범위에 영향을 주지 않습니다.

상속

자식 범위는 부모 범위에서 변수, 별칭 및 함수를 상속하지 않습니다. 항목이 private이 아니면 자식 범위가 부모 범위의 항목을 볼 수 없습니다. 또한 부모 범위를 명시적으로 지정하여 항목을 변경할 수 있지만 항목은 자식 범위에 포함되지 않습니다.

그러나 자식 범위는 항목 집합으로 만들어집니다. 일반적으로 이 범위에는 AllScope 옵션이 있는 모든 별칭이 포함됩니다. 이 옵션은 이 항목의 뒷부분에서 설명합니다. 여기에는 AllScope 옵션이 있는 모든 변수와 MaximumFunctionCount와 같이 범위를 사용자 지정하는 데 사용될 수 있는 몇몇 변수가 포함됩니다.

특정 범위에서 항목을 찾으려면 Get-Variable 또는 Get-Alias의 Scope 매개 변수를 사용합니다.

예를 들어 로컬 범위의 모든 변수를 가져오려면 다음을 입력합니다.

        get-variable -scope local

전역 범위의 모든 변수를 가져오려면 다음을 입력합니다.

        get-variable -scope global

범위 한정자

새 변수, 별칭 또는 함수의 범위를 지정하려면 범위 한정자를 사용합니다. 유효한 한정자 값은 Global, Local, Private 및 Script입니다.

변수의 범위 한정자에 대한 구문은 다음과 같습니다.

        $[<scope-modifier>]:<name> = <value>

함수의 범위 한정자에 대한 구문은 다음과 같습니다.

        function [<scope-modifier>]:<name> {<function-body>}

스크립트에 대한 기본 범위는 스크립트 범위입니다. 함수 및 별칭에 대한 기본 범위는 스크립트에 정의되어 있지 않더라도 로컬 범위입니다.

범위 한정자를 사용하지 않는 다음 명령은 현재 또는 로컬 범위에서 변수를 만듭니다.

       $a = "one"

전역 범위에서 같은 변수를 만들려면 Global 범위 한정자를 사용합니다.

       $global:a = "one"

스크립트 범위에서 같은 변수를 만들려면 script 범위 한정자를 사용합니다.

       $script:a = "one"

함수에서 범위 한정자를 사용할 수도 있습니다. 다음 함수 정의는 전역 범위에서 함수를 만듭니다.

       function global:Hello
       {
    write-host "Hello, World"
       }

범위 한정자를 사용하여 다른 범위를 변수를 참조할 수도 있습니다. 다음 명령은 $test 변수를 먼저 로컬 범위에서 참조하고 나서 전역 범위에서 참조합니다.

      $test

      $global:test

USING 범위 한정자

Using은 원격 명령에서 지역 변수를 식별하는 특수 범위 한정자입니다. 기본적으로 원격 명령의 변수는 원격 세션에서 정의된 것으로 간주합니다.

Using 범위 한정자는 Windows PowerShell 3.0에 도입되었습니다.

자세한 내용은 about_Remote_Variables를 참조하세요.

ALLSCOPE 옵션

변수 및 별칭에는 AllScope 값을 사용할 수 있는 Option 속성이 있습니다. AllScope 속성이 있는 항목은 부모 범위에 의해 소급 상속되지 않지만 직접 만든 자식 범위에 포함됩니다.

AllScope 속성이 있는 모든 항목은 자식 범위에 표시되고 해당 범위에 포함됩니다. 임의 범위의 항목에 대한 변경은 변수가 정의된 모든 범위에 영향을 줍니다.

범위 관리

여러 cmdlet에는 특정 범위의 항목을 가져오거나 설정(만들고 변경)할 수 있는 Scope 매개 변수가 있습니다. 다음 명령을 사용하여 Scope 매개 변수가 있는 세션의 모든 cmdlet을 찾습니다.

         get-help * -parameter scope

특정 범위에 표시되는 변수를 찾으려면 Get-Variable의 Scope 매개 변수를 사용합니다. 표시되는 매개 변수에는 전역 매개 변수, 부모 범위의 매개 변수, 현재 범위의 매개 변수가 포함됩니다. 여기에 섹션 본문을 입력합니다.

예를 들어 다음 명령은 로컬 범위에 표시되는 변수를 가져옵니다.

        get-variable -scope local

특정 범위의 변수를 만들려면 범위 한정자 또는 Set-Variable의 Scope 매개 변수를 사용합니다. 다음 명령은 전역 범위의 변수를 만듭니다.

        new-variable -scope global -name a -value "One"

New-Alias, Set-Alias 또는 Get-Alias cmdlets의 Scope 매개 변수를 사용하여 범위를 지정할 수도 있습니다. 다음 명령은 전역 범위의 별칭을 만듭니다.

        new-alias -scope global -name np -value Notepad.exe

특정 범위의 함수를 가져오려면 해당 범위에 있을 때 Get-Item cmdlet을 사용합니다. Get-Item cmdlet에는 범위 매개 변수가 없습니다.

범위에서 도트 소싱 표기법 사용

스크립트 및 함수는 모든 범위 규칙을 따릅니다. 스크립트 및 함수는 특정 범위에서 만들고, cmdlet 매개 변수나 범위 한정자를 사용하여 해당 범위를 변경하지 않는 한 해당 범위에만 영향을 줍니다.

그러나 도트 소싱 표기범을 사용하여 현재 범위에 스크립트 또는 함수를 추가할 수 있습니다. 그리고 나면 스크립트가 현재 범위에서 실행될 때 스크립트에서 만든 함수, 별칭 및 변수를 현재 범위에서 사용할 수 있습니다.

현재 범위에 함수를 추가하려면 함수 호출에서 함수의 경로 및 이름 앞에 점(.) 및 공백을 입력합니다.

예를 들어 스크립트 범위의 C:\Scripts 디렉터리(스크립트의 기본값)에서 Sample.ps1 스크립트를 실행하려면 다음 명령을 사용합니다.

        c:\scripts\sample.ps1

로컬 범위에서 Sample.ps1 스크립트를 실행하려면 다음 명령을 사용합니다.

        . c:\scripts.sample.ps1

호출 연산자(&)를 사용하여 함수나 스크립트를 실행하면 함수나 스크립트가 현재 범위에 추가되지 않습니다. 다음 예제에서는 호출 연산자를 사용합니다.

        & c:\scripts.sample.ps1

Sample.ps1 스크립트에서 만든 별칭, 함수 또는 변수는 현재 범위에서 사용할 수 없습니다.

범위 없이 제한

몇 가지 Windows PowerShell 개념은 범위와 비슷하거나 범위와 상호 작용합니다. 이들 개념은 범위 또는 범위 동작과 혼동될 수 있습니다.

세션, 모듈 및 중첩 프롬프트는 자체 포함된 환경이지만 세션에서는 전역 범위의 자식 범위가 아닙니다.

  • 세션:
    세션은 Windows PowerShell이 실행되는 환경입니다. 원격 컴퓨터에서 세션을 만들면 Windows PowerShell에서는 원격 컴퓨터에 대한 영구 연결을 설정합니다. 영구 연결을 통해 해당 세션을 여러 관련 명령에 사용할 수 있습니다.

    세션은 포함된 환경이므로 자체 범위가 있지만 세션은 만들어진 세션의 자식 범위가 아닙니다. 세션은 자체 전역 범위로 시작합니다. 이 범위는 세션의 전역 범위에 독립적입니다. 세션에서 자식 범위를 만들 수 있습니다. 예를 들어 스크립트를 실행하여 세션에서 자식 범위를 만들 수 있습니다.

  • 모듈:
    Windows PowerShell 모듈을 사용하여 Windows PowerShell 도구를 공유 및 전달할 수 있습니다. 모듈은 cmdlet, 스크립트, 함수, 변수, 별칭 및 기타 유용한 항목을 포함할 수 있는 단위입니다. 명시적으로 정의되지 않은 모듈의 항목에는 모듈 외부에서 액세스할 수 없습니다. 따라서 다른 항목이 세션의 cmdlet, 스크립트, 함수 및 기타 항목을 재정의할 수 있다는 점을 걱정하지 않고 세션에 모듈을 추가하고 public 항목을 사용할 수 있습니다.

    모듈의 개인 정보는 범위처럼 동작하지만 세션에 모듈을 추가해도 범위가 변경되지 않습니다. 또한 모든 Windows PowerShell 스크립트처럼 모듈의 스크립트에는 자체 범위가 있지만 모듈에는 자체 범위가 없습니다.

  • 중첩 프롬프트:
    마찬가지로 중첩 프롬프트에는 자체 범위가 없습니다. 중첩 프롬프트를 입력할 때 중첩 프롬프트는 환경의 하위 집합입니다. 그러나 사용자는 로컬 범위 내에 남아 있습니다.

    스크립트에는 자체 범위가 있습니다. 스크립트를 디버그하는 동안 스크립트의 중단점에 도달하면 스크립트 범위로 들어갑니다.

  • Private 옵션:
    별칭 및 변수에는 Private 값을 사용할 수 있는 Option 속성이 있습니다. Private 옵션이 있는 항목은 항목이 만들어진 범위에서 보고 변경할 수 있지만, 해당 범위 외부에서는 보거나 변경할 수 없습니다.

    예를 들어 전역 범위에 private 옵션이 있는 변수를 만들고 스크립트를 실행하면 스크립트의 Get-Variable 명령은 private 변수를 표시하지 않습니다. global 범위 한정자를 사용해도 이 문제가 발생합니다.

    New-Variable, Set-Variable, New-Alias 및 Set-Alias cmdlet의 Option 매개 변수를 사용하여 Option 속성 값을 Private으로 설정할 수 있습니다.

  • Visibility:
    변수 또는 별칭의 Visibility 속성에 따라 항목이 만들어진 모듈 등의 컨테이너 외부에서 해당 항목을 볼 수 있는지 결정됩니다. 범위에 대한 Option 속성의 Private 값이 디자인되는 것과 같은 방식을 컨테이너에 대한 Visibility가 디자인됩니다.

    Visibility 속성은 Public 및 Private 값을 사용합니다. private visibility가 있는 항목은 해당 항목이 만들어진 컨테이너에서만 보고 변경할 수 있습니다. 컨테이너를 추가하거나 가져오면 private visibility가 있는 항목을 보거나 변경할 수 없습니다.

    컨테이너에 대한 Visibility가 디자인되므로 Visibility가 범위에서 다르게 작동합니다. 전역 범위에 private visibility가 있는 항목을 만들면 모든 범위에서 해당 항목을 보거나 변경할 수 없습니다. private visibility가 있는 변수의 값을 보거나 변경하려고 하면 Windows PowerShell가 오류 메시지를 반환합니다.

    New-Variable 및 Set-Variable cmdlet을 사용하여 private visibility가 있는 변수를 만들 수 있습니다.

예제

예제 1: 스크립트에서 변수 값만 변경

다음 명령은 스크립트에서 $ConfirmPreference 변수 값을 변경합니다. 변경은 전역 범위에 영향을 주지 않습니다.

먼저 로컬 범위에 $ConfirmPreference 변수 값을 표시하려면 다음 명령을 사용합니다.

          C:\PS> $ConfirmPreference
          High

다음 명령이 포함된 Scope.ps1 스크립트를 만듭니다.

          $ConfirmPreference = "Low"
          "The value of `$ConfirmPreference is $ConfirmPreference."

스크립트를 실행합니다. 스크립트에서는 $ConfirmPreference 변수 값을 변경하고 나서 스크립트 범위에서 해당 값을 보고합니다. 출력은 다음 출력과 비슷해야 합니다.

          The value of $ConfirmPreference is Low.

그다음에 현재 범위에서 $ConfirmPreference 변수의 현재 값을 테스트합니다.

          C:\PS> $ConfirmPreference
          High

이 예제에서는 스크립트 범위의 변수 값 변경이 부모 범위의 해당 변수 값에 영향을 주지 않음을 보여 줍니다.

예제 2: 다른 범위에서 변수 값 보기

범위 한정자를 사용하여 로컬 범위 및 부모 범위에서 변수 값을 볼 수 있습니다.

먼저 전역 범위에서 $test 변수를 정의합니다.

        $test = "Global"

그다음에 $test 변수를 정의하는 Sample.ps1 스크립트를 만듭니다. 스크립트에서 범위 한정자를 사용하여 $test 변수의 전역 또는 로컬 버전을 참조합니다. 여기에 섹션 본문을 삽입합니다.

          # In Sample.ps1

          $test = "Local"
          "The local value of `$test is $test."
          "The global value of `$test is $global:test."

Sample.ps1을 실행할 때 출력은 다음 출력과 비슷해야 합니다.

          The local value of $test is Local.
          The global value of $test is Global.

스크립트가 완료되면 $test의 전역 값만 세션에서 정의됩니다.

          C:\PS> $test
          Global

예제 3: 부모 범위에서 변수 값 변경

Private 옵션이나 다른 방법으로 항목을 보호하지 않으면 부모 범위에서 변수 값을 보고 변경할 수 있습니다.

먼저 전역 범위에서 $test 변수를 정의합니다.

        $test = "Global"

그다음에 $test 변수를 정의하는 Sample.ps1 스크립트를 만듭니다. 스크립트에서 범위 한정자를 사용하여 $test 변수의 전역 또는 로컬 버전을 참조합니다.

          # In Sample.ps1

          $global:test = "Local"
          "The global value of `$test is $global:test."

스크립트가 완료되면 $test의 전역 값이 변경됩니다.

          C:\PS> $test
          Local

예제 4: Private 변수 만들기

private 변수는 Private 값이 있는 Option 속성이 포함된 변수입니다. 자식 범위가 Private 변수를 상속하지만 이 변수는 변수가 만들어진 범위에서만 보거나 변경할 수 있습니다.

다음 명령은 로컬 범위에서 $ptest라는 private 변수를 만듭니다.

        New-Variable -Name ptest -Value 1 -Option private

로컬 범위에서 $ptest 값을 표시하고 변경할 수 있습니다.

          C:\PS> $ptest
          1
          C:\PS> $ptest = 2
          C:\PS> $ptest
          2

그다음에 다음 명령이 포함된 Sample.ps1 스크립트를 만듭니다. 이 명령은 $ptest 값을 표시하고 변경하려고 합니다.

          # In Sample.ps1

          "The value of `$Ptest is $Ptest."
          "The value of `$Ptest is $global:Ptest."

$ptest 변수는 스크립트 범위에서 표시되지 않으므로 출력이 비어 있습니다.

          "The value of $Ptest is ."
          "The value of $Ptest is ."

예제 5: 원격 명령에서 지역 변수 사용

원격 명령의 변수가 로컬 세션에서 만들어졌음을 표시하려면 Using 범위 한정자를 사용합니다. 기본적으로 Windows PowerShell에서는 원격 명령의 변수가 원격 세션에서 만들어졌다고 간주합니다.

구문은 다음과 같습니다.

           $Using:<VariableName>

예를 들어 다음 명령은 $Cred 변수를 로컬 세션에서 만들고 나서 $Cred 변수를 원격 명령에서 사용합니다.

           $Cred = Get-Credential
           Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

Using 범위는 Windows PowerShell 3.0에 도입되었습니다.

Windows PowerShell 2.0에서 변수가 로컬 세션에서 만들어졌음을 나타내려면 다음 명령 형식을 사용합니다.

           $Cred = Get-Credential
           Invoke-Command $s {param($c) Remove-Item .\Test*.ps1 -Credential $c} -ArgumentList $Cred

참고 항목

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks