항목
    about_Scopes

간단한 설명
    Windows PowerShell의 범위 개념에 대해 설명하고 요소의 범위를 설정하고 변경하는 방법을 보여 줍니다.

    
자세한 설명
    Windows PowerShell은 변수, 별칭, 함수 및 Windows PowerShell 드라이브(PSDrive)를 읽고 변경할 수 있는 
    위치를 제한하여 이러한 항목에 대한 액세스를 보호합니다. 범위에 대한 몇 가지 간단한 규칙을 적용하여 
    Windows PowerShell은 변경되지 않아야 하는 항목을 실수로 변경하지 않도록 도와 줍니다.


    범위의 기본 규칙은 다음과 같습니다.

        - 범위에 포함하는 항목은 명시적으로 개인 항목으로 만들지 않는 한 항목이 만들어진 범위와 모든 하위 
          범위에서 표시됩니다. 변수, 별칭, 함수 또는 Windows PowerShell 드라이브를 하나 이상의 범위에 
          배치할 수 있습니다. 

        - 범위 안에 만든 항목은 명시적으로 다른 범위를 지정하지 않는 한 항목이 만들어진 범위에서만 변경될 
          수 있습니다.


    한 범위에서 만드는 항목이 다른 범위의 항목과 이름을 공유하는 경우 원래 항목이 새 항목 아래에 숨겨질 
    수 있습니다. 그러나 원래 항목이 재정의되거나 변경되지는 않습니다.


  Windows PowerShell 범위

    Windows PowerShell의 범위에는 이름과 번호가 모두 있습니다. 명명된 범위는 절대 범위를 지정합니다. 
    번호는 상대적이며 범위 간의 관계를 나타냅니다.


    전역: 
        Windows PowerShell이 시작될 때 적용되는 범위입니다. Windows PowerShell이 시작될 
        때 존재하는 변수와 함수는 전역 범위에서 만들어진 것입니다. 여기에는 자동 변수와 기본 설정 
        변수가 포함되며, Windows PowerShell 프로필에 있는 변수, 별칭 및 함수도 포함됩니다. 

    로컬: 
        현재 범위입니다. 로컬 범위는 전역 범위나 다른 범위일 수 있습니다. 

    스크립트: 
        스크립트 파일이 실행되는 동안 만들어진 범위입니다. 스크립트의 명령만 스크립트 범위에서 
        실행됩니다. 스크립트에 있는 명령의 경우 스크립트 범위는 로컬 범위입니다.

    개인:
        현재 범위 밖에서는 개인 범위의 항목을 표시할 수 있습니다. 개인 범위를 사용하여 다른 범위에서
        이름이 같은 항목의 개인 버전을 만들 수 있습니다.


    번호가 매겨진 범위:
        다른 범위에 대한 한 범위의 상대적 위치를 나타내는 번호나 이름으로 범위를 참조할 수 있습니다.
        범위 0은 현재 또는 로컬 범위를 나타내고, 범위 1은 직접 상위 범위를 나타내며, 범위 2는 직접 상위 
        범위의 상위를 나타내는 식으로 범위의 번호가 매겨집니다. 번호가 매겨진 범위는 많은 재귀 범위를 
        만든 경우 유용합니다.


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


    Windows PowerShell에서 모든 범위는 전역 범위의 하위 범위이지만 많은 범위와 많은 재귀 범위를 만들 
    수 있습니다.


    항목을 명시적으로 개인 항목으로 만들지 않는 한 상위 범위의 항목을 하위 범위에서 사용할 수 있습니다. 
    그러나 하위 범위에서 만들고 변경하는 항목은 항목을 만들 때 명시적으로 범위를 지정하지 않는 한 
    상위 범위에 영향을 미치지 않습니다.

    
 상속
 
    하위 범위는 상위 범위에서 변수, 별칭 및 함수를 상속하지 않습니다. 개인 항목이 아닌 경우 하위 
    범위에서는 상위 범위의 항목을 표시할 수 있습니다. 또한 하위 범위에서는 명시적으로 상위 범위를 
    지정하여 항목을 변경할 수 있지만 이러한 항목은 하위 범위에 속하지 않습니다.


    그러나 하위 범위는 일련의 항목과 함께 만들어집니다. 일반적으로 하위 범위에는 AllScope 옵션이 있는 
    모든 별칭이 포함됩니다. 이 옵션에 대해서는 이 항목의 뒷부분에서 설명합니다. 하위 범위에는 AllScope 
    옵션이 있는 모든 변수와 범위를 사용자 지정하는 데 사용할 수 있는 MaximumFunctionCount 등의 일부 
    변수가 포함됩니다.


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


    예를 들어 로컬 범위에서 모든 변수를 가져오려면 다음과 같이 입력하십시오.

	get-variable -scope local


    전역 범위에서 모든 변수를 가져오려면 다음과 같이 입력하십시오.

	get-variable -scope global


 범위 한정자
 
    새 변수, 별칭 또는 함수의 범위를 지정하려면 범위 한정자를 사용합니다. 한정자의 유효한 값은 Global 
    및 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


 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 cmdlet의 Scope 매개 변수를 사용하여 범위를 지정할 
    수도 있습니다. 다음 명령은 전역 범위에서 별칭을 만듭니다.

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


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


 범위와 함께 도트 소싱 표기법 사용
 
    스크립트와 함수는 범위의 모든 규칙을 따릅니다. 사용자는 특정 범위에서 스크립트와 함수를 만들며, 
    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, 스크립트, 함수 및 기타 항목을 
        재정의할 수 있는 점을 우려하지 않고 공용 항목을 사용할 수 있습니다. 


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


    중첩 프롬프트:
        마찬가지로 중첩 프롬프트에는 자체 범위가 없습니다. 중첩 프롬프트로 전환할 때 중첩 프롬프트는 
        환경의 하위 집합입니다. 그러나 사용자는 계속 로컬 범위 안에 있습니다. 


        스크립트에는 자체 범위가 있습니다. 스크립트를 디버깅하는 경우 스크립트에서 중단점에 도달하면 
        스크립트 범위로 전환됩니다.


    Private Option:
        별칭과 변수에는 Private 값을 사용할 수 있는 Option 속성이 있습니다. Private Option이 
        있는 항목은 이러한 항목이 만들어진 범위에서 표시되고 변경될 수 있지만 해당 범위 밖에서는 
        표시되거나 변경될 수 없습니다. 


        예를 들어 전역 범위에서 Private Option이 있는 변수를 만든 다음 스크립트를 실행하는 경우 
        스크립트의 Get-Variable 명령은 개인 변수를 표시하지 않습니다. 전역 범위 한정자를 사용하는 
        경우에도 이러한 현상이 발생합니다. 
   

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


    Visibility:
        변수나 별칭의 Visibility 속성에 따라 해당 항목이 만들어진 모듈 등의 컨테이너 외부에서 해당 항목이 
        표시될 수 있는지 여부가 결정됩니다. Visibility는 Option 속성의 Private 값이 범위용으로 설계된 것과 
        동일하게 컨테이너용으로 설계되었습니다.


        Visibility 속성은 Public 및 Private 값을 사용합니다. Private Visibility가 있는 항목은 해당 항목이 
        만들어진 컨테이너에서만 표시되고 변경될 수 있습니다. 컨테이너를 추가하거나 가져오는 경우 
        Private 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 변수의 전역 또는 로컬 버전을 참조합니다.


          # 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 Option이나 다른 방법을 사용하여 항목을 보호하지 않는 한 상위 범위에서 변수 값을 표시하고 
      변경할 수 있습니다.


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

	  $test = "Global"


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

          # Sample.ps1의 경우

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

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

          C:\PS> $test
          Local
          

  예제 4: 개인 변수 만들기

      개인 변수는 Private 값을 가진 Option 속성이 있는 변수입니다. 개인 변수는 하위 범위에서 상속되지만 
      개인 변수가 만들어진 범위에서만 표시되거나 변경될 수 있습니다.


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

	  new-variable -name ptest -value 1 -option private


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

	  C:\PS> $ptest
          1
          C:\PS> $ptest = 2
          C:\PS> $ptest
	  2
         
      
      다음으로 아래의 명령을 포함하는 Sample.ps1 스크립트를 만듭니다.
      이 명령은 $ptest의 값을 표시하고 변경하려고 합니다.  

          # 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 ."
        
   
참고 항목
    about_Variables
    about_Environment_Variables
    about_Functions
    about_Script_Blocks















목차