다음을 통해 공유


범위 정보

간단한 설명

PowerShell의 scope 개념을 설명하고 요소의 scope 설정하고 변경하는 방법을 보여 줍니다.

자세한 설명입니다.

PowerShell은 읽고 변경할 수 있는 위치를 제한하여 변수, 별칭, 함수 및 PSDrive(PowerShell 드라이브)에 대한 액세스를 보호합니다. PowerShell은 scope 규칙을 사용하여 변경해서는 안 되는 항목을 실수로 변경하지 않도록 합니다.

다음은 scope 기본 규칙입니다.

  • 범위는 중첩할 수 있습니다. 외부 scope 부모 scope라고 합니다. 중첩된 범위는 해당 부모의 자식 범위입니다.

  • 항목을 만든 scope 명시적으로 비공개로 설정하지 않는 한 모든 자식 범위에 표시됩니다. 변수, 별칭, 함수 또는 PowerShell 드라이브를 하나 이상의 범위에 배치할 수 있습니다.

  • 다른 scope 명시적으로 지정하지 않는 한 scope 내에서 만든 항목은 만든 scope만 변경할 수 있습니다.

scope 항목을 만들고 항목이 다른 scope 항목과 해당 이름을 공유하는 경우 원래 항목은 새 항목 아래에 숨겨져 있을 수 있지만 재정의되거나 변경되지는 않습니다.

PowerShell 범위

PowerShell은 다음 범위를 지원합니다.

  • 전역: PowerShell이 시작될 때 적용되는 scope. PowerShell이 시작될 때 존재하는 변수 및 함수는 자동 변수 및 기본 설정 변수와 같은 전역 scope 만들어졌습니다. PowerShell 프로필의 변수, 별칭 및 함수도 전역 scope 만들어집니다.

  • 로컬: 현재 scope. 로컬 scope 전역 scope 또는 다른 scope 될 수 있습니다.

  • 스크립트: 스크립트 파일이 실행되는 동안 생성되는 scope. 스크립트의 명령만 스크립트에서 실행 scope. 스크립트의 명령에 scope 스크립트는 로컬 scope.

참고

프라이빗은 scope 아닙니다. 항목이 정의된 scope 외부에서 항목의 표시 유형을 변경하는 옵션입니다.

부모 및 자식 범위

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

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

항목을 명시적으로 비공개로 설정하지 않는 한 부모 scope 항목은 자식 scope 사용할 수 있습니다. 그러나 자식 scope 만들고 변경하는 항목은 항목을 만들 때 scope 명시적으로 지정하지 않는 한 부모 scope 영향을 미치지 않습니다.

상속

자식 scope 부모 scope 변수, 별칭 및 함수를 상속하지 않습니다. 항목이 private이 아니면 자식 scope 부모 scope 항목을 볼 수 있습니다. 또한 부모 scope 명시적으로 지정하여 항목을 변경할 수 있지만 항목은 자식 scope 일부가 아닙니다.

그러나 항목 집합을 사용하여 자식 scope 만들어집니다. 일반적으로 AllScope 옵션이 있는 모든 별칭이 포함됩니다. 이 옵션은 이 문서의 뒷부분에 설명되어 있습니다. 여기에는 AllScope 옵션이 있는 모든 변수와 일부 자동 변수가 포함됩니다.

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

예를 들어 로컬 scope 모든 변수를 얻으려면 다음을 입력합니다.

Get-Variable -Scope local

전역 scope 모든 변수를 얻으려면 다음을 입력합니다.

Get-Variable -Scope global

범위 한정자

변수, 별칭 또는 함수 이름에는 다음 선택적 scope 한정자 중 하나가 포함될 수 있습니다.

  • global:- 전역 scope 이름이 있는지 지정합니다.

  • local:- 로컬 scope 이름이 있는지 지정합니다. 현재 scope 항상 로컬 scope.

  • private:- 이름이 Private이며 현재 scope만 표시되도록 지정합니다.

  • script:- 스크립트 scope 이름이 있는지 지정합니다. 스크립트 scope 가장 가까운 상위 스크립트 파일이 없는 경우 가장 가까운 상위 스크립트 파일의 scope 또는 전역입니다.

  • using:- 및 Invoke-Command와 같은 Start-Job cmdlet을 통해 스크립트를 실행하는 동안 다른 scope 정의된 변수에 액세스하는 데 사용됩니다.

  • workflow: - 이름이 워크플로 내에 있는지 지정합니다. 참고: PowerShell Core에서는 워크플로가 지원되지 않습니다.

  • <variable-namespace> - PowerShell PSDrive 공급자가 만든 한정자입니다. 예를 들면 다음과 같습니다.

    네임스페이스 Description
    Alias: 현재 scope 정의된 별칭
    Env: 현재 scope 정의된 환경 변수
    Function: 현재 scope 정의된 함수
    Variable: 현재 scope 정의된 변수

스크립트의 기본 scope 스크립트 scope. 함수 및 별칭에 대한 기본 scope 스크립트에 정의된 경우에도 로컬 scope.

scope 한정자 사용

새 변수, 별칭 또는 함수의 scope 지정하려면 scope 한정자를 사용합니다.

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

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

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

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

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

$a = "one"

전역 scope 동일한 변수를 만들려면 scope global: 한정자를 사용합니다.

$global:a = "one"

스크립트 scope 동일한 변수를 만들려면 scope 한정자를 사용합니다 script: .

$script:a = "one"

함수와 함께 scope 한정자를 사용할 수도 있습니다. 다음 함수 정의는 전역 scope 함수를 만듭니다.

function global:Hello {
  Write-Host "Hello, World"
}

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

$test
$global:test

Using: 범위 한정자

은 원격 명령에서 지역 변수를 식별하는 특수 scope 한정자입니다. 한정자가 없으면 PowerShell은 원격 명령의 변수가 원격 세션에서 정의될 것으로 예상합니다.

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

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

AllScope 옵션

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

AllScope 속성이 있는 항목은 자식 scope 표시되며 해당 scope 일부입니다. 모든 scope 항목에 대한 변경 내용은 변수가 정의된 모든 범위에 영향을 줍니다.

범위 관리

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

Get-Help * -Parameter scope

특정 scope 표시되는 변수를 찾으려면 의 Get-Variable매개 변수를 Scope 사용합니다. 표시되는 변수에는 전역 변수, 부모 scope 변수 및 현재 scope 변수가 포함됩니다.

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

Get-Variable -Scope local

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

New-Variable -Scope global -Name a -Value "One"

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

New-Alias -Scope global -Name np -Value Notepad.exe

특정 scope 함수를 얻으려면 scope 있을 때 cmdlet을 사용합니다Get-Item. cmdlet에 Get-ItemScope 매개 변수가 없습니다.

참고

Scope 매개 변수를 사용하는 cmdlet의 경우 숫자로 범위를 참조할 수도 있습니다. 이 숫자는 한 scope 다른 scope 상대적 위치를 설명합니다. 범위 0은 현재 또는 로컬 scope 나타냅니다. 범위 1은 직접 부모 scope 나타냅니다. 범위 2는 부모 scope 부모 등을 나타냅니다. 번호가 매겨진 범위는 많은 재귀 범위를 만든 경우에 유용합니다.

범위와 함께 점 원본 표기법 사용

스크립트 및 함수는 scope 모든 규칙을 따릅니다. 특정 scope 만들고 cmdlet 매개 변수 또는 scope 한정자를 사용하여 해당 scope 변경하지 않는 한 해당 scope만 영향을 미칩니다.

그러나 점 원본 표기법을 사용하여 현재 scope 스크립트 또는 함수를 추가할 수 있습니다. 그런 다음 스크립트가 현재 scope 실행되면 스크립트에서 만드는 모든 함수, 별칭 및 변수를 현재 scope 사용할 수 있습니다.

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

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

c:\scripts\sample.ps1

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

. c:\scripts.sample.ps1

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

& c:\scripts.sample.ps1

about_operators 호출 연산자에 대해 자세히 확인할 수 있습니다.

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

범위 없이 제한

몇 가지 PowerShell 개념은 scope 또는 scope 상호 작용하는 것과 유사합니다. 이러한 개념은 scope 또는 scope 동작과 혼동될 수 있습니다.

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

세션

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

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

모듈

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

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

기본적으로 모듈은 현재 scope 아닌 현재 세션 상태의 최상위 수준으로 로드됩니다. 모듈 세션 상태 또는 전역 세션 상태일 수 있습니다. 전역 scope 있는 경우 모듈이 전역 세션 상태로 로드됩니다. 모든 내보내기 는 전역 테이블에 배치됩니다. module1 내에서 module2를 로드하면 module2가 전역 세션 상태가 아닌 module1의 세션 상태로 로드됩니다. module2의 모든 내보내기 는 module1의 세션 상태 맨 위에 배치됩니다. 를 사용하는 Import-Module -Scope local경우 내보내기 는 최상위 수준이 아닌 현재 scope 개체에 배치됩니다. 모듈에 있고 (또는 Import-Module -Global)를 사용하여 Import-Module -Scope global 다른 모듈을 로드하는 경우 해당 모듈과 내보내기 모듈은 모듈의 로컬 세션 상태 대신 전역 세션 상태로 로드됩니다. 이 기능은 모듈을 조작하는 모듈을 작성하기 위해 설계되었습니다. Windows 호환성 모듈은 프록시 모듈을 전역 scope 가져오기 위해 이 작업을 수행합니다.

중첩 프롬프트

마찬가지로 중첩된 프롬프트에는 자체 scope 없습니다. 중첩 프롬프트를 입력하면 중첩 프롬프트가 환경의 하위 집합입니다. 그러나 로컬 scope 내에 남아 있습니다.

스크립트에는 고유한 scope 있습니다. 스크립트를 디버깅하고 스크립트의 중단점에 도달하는 경우 스크립트 scope 입력합니다.

프라이빗 옵션

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

예를 들어 전역 scope 프라이빗 옵션이 있는 변수를 만든 다음 스크립트를 실행하는 경우 스크립트 Get-Variable 의 명령은 프라이빗 변수를 표시하지 않습니다. 이 instance 전역 scope 한정자를 사용하면 프라이빗 변수가 표시되지 않습니다.

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

가시 거리

변수 또는 별칭의 Visibility 속성은 생성된 컨테이너 외부에서 항목을 볼 수 있는지 여부를 결정합니다. 컨테이너는 모듈, 스크립트 또는 스냅인일 수 있습니다. 표시 유형은 Option 속성의 Private 값이 범위를 위해 디자인된 것과 동일한 방식으로 컨테이너용으로 설계되었습니다.

Visibility 속성은 PublicPrivate 값을 사용합니다. 프라이빗 표시 유형이 있는 항목은 만들어진 컨테이너에서만 보고 변경할 수 있습니다. 컨테이너를 추가하거나 가져오는 경우 프라이빗 표시 유형이 있는 항목을 보거나 변경할 수 없습니다.

표시 유형은 컨테이너용으로 설계되었기 때문에 scope 다르게 작동합니다.

  • 전역 scope 프라이빗 표시 유형이 있는 항목을 만드는 경우 scope 항목을 보거나 변경할 수 없습니다.
  • 프라이빗 표시 유형이 있는 변수의 값을 보거나 변경하려고 하면 PowerShell에서 오류 메시지가 반환됩니다.

Set-Variable cmdlet을 New-Variable 사용하여 프라이빗 표시 유형이 있는 변수를 만들 수 있습니다.

예제

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

다음 명령은 스크립트의 $ConfirmPreference 변수 값을 변경합니다. 변경 내용은 전역 scope 영향을 주지 않습니다.

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

PS>  $ConfirmPreference
High

다음 명령을 포함하는 Scope.ps1 스크립트를 Create.

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

스크립트를 실행합니다. 스크립트는 변수의 $ConfirmPreference 값을 변경한 다음 스크립트 scope 해당 값을 보고합니다. 출력은 다음 출력과 유사해야 합니다.

The value of $ConfirmPreference is Low.

다음으로, 현재 scope 변수의 $ConfirmPreference 현재 값을 테스트합니다.

PS>  $ConfirmPreference
High

이 예제에서는 스크립트 scope 변수 값에 대한 변경 내용이 부모 scope 변수의 값에 영향을 주지 않음을 보여줍니다.

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

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

먼저 전역 scope 변수를 정의 $test 합니다.

$test = "Global"

다음으로 변수를 정의하는 Sample.ps1 스크립트를 $test 만듭니다. 스크립트에서 scope 한정자를 사용하여 변수의 전역 또는 로컬 버전을 참조합니다$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 만 세션에 정의됩니다.

PS>  $test
Global

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

Private 옵션 또는 다른 메서드를 사용하여 항목을 보호하지 않는 한 부모 scope 변수 값을 보고 변경할 수 있습니다.

먼저 전역 scope 변수를 정의 $test 합니다.

$test = "Global"

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

Sample.ps1:

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

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

PS>  $test
Local

예제 4: 프라이빗 변수 만들기

프라이빗 변수는 값이 PrivateOption 속성이 있는 변수입니다. 프라이빗 변수는 자식 scope 상속되지만 생성된 scope만 보거나 변경할 수 있습니다.

다음 명령은 로컬 scope 라는 $ptest 프라이빗 변수를 만듭니다.

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

로컬 scope 값을 $ptest 표시하고 변경할 수 있습니다.

PS>  $ptest
1

PS>  $ptest = 2
PS>  $ptest
2

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

Sample.ps1:

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

변수는 $ptest 스크립트 scope 표시되지 않고 출력은 비어 있습니다.

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

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

로컬 세션에서 만든 원격 명령의 변수의 경우 scope 한정자를 사용합니다 Using . PowerShell은 원격 명령의 변수가 원격 세션에서 만들어졌다고 가정합니다.

구문은 다음과 같습니다.

$Using:<VariableName>

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

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

Using scope PowerShell 3.0에서 도입되었습니다. 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