about_Scopes

간단한 설명

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

자세한 설명

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

범위 규칙

PowerShell을 시작하면 호스트(pwsh.exe)가 PowerShell Runspace를 만듭니다. 호스트 프로세스에는 여러 Runspace가 있을 수 있습니다. 각 Runspace에는 자체 세션 상태 및 범위 컨테이너가 있습니다. 세션 상태 및 범위는 Runspace 인스턴스에서 액세스할 수 없습니다.

다음은 범위의 기본 규칙입니다.

  • 범위는 중첩할 수 있습니다. 외부 범위를 부모 범위라고 합니다. 중첩된 범위는 해당 부모의 자식 범위입니다.
  • 항목은 명시적으로 비공개로 지정하지 않는 한 만들어진 범위 및 모든 자식 범위에 표시됩니다.
  • 현재 범위를 벗어난 범위에 대해 변수, 별칭, 함수 및 PowerShell 드라이브를 선언할 수 있습니다.
  • 다른 범위를 명시적으로 지정하지 않는 한 범위 내에서 만든 항목은 만들어진 범위에서만 변경할 수 있습니다.
  • Runspace에서 실행되는 코드가 항목을 참조하는 경우 PowerShell은 현재 범위부터 시작하여 각 부모 범위를 진행하여 범위 계층 구조를 검색합니다. 항목을 찾을 수 없으면 현재 범위에 새 항목이 만들어집니다. 일치하는 항목을 찾으면 항목 값이 발견된 범위에서 검색됩니다. 값을 변경하는 경우 변경 내용이 현재 범위에만 영향을 주도록 현재 범위에 복사된 항목입니다.
  • 다른 범위의 항목과 해당 이름을 공유하는 항목을 명시적으로 만드는 경우 원래 항목은 새 항목에 의해 숨겨질 수 있지만 재정의되거나 변경되지는 않습니다.

부모 및 자식 범위

스크립트 또는 함수를 호출하여 새 자식 범위를 만들 수 있습니다. 호출 범위는 부모 범위입니다. 호출된 스크립트 또는 함수는 자식 범위입니다. 호출하는 함수 또는 스크립트는 다른 함수를 호출하여 루트 범위가 전역 범위인 자식 범위의 계층 구조를 만들 수 있습니다.

참고 항목

모듈의 함수는 호출 범위의 자식 범위에서 실행되지 않습니다. 모듈에는 모듈을 가져온 범위에 연결된 자체 세션 상태가 있습니다. 모든 모듈 코드는 자체 루트 범위가 있는 범위의 모듈별 계층 구조에서 실행됩니다. 자세한 내용은 이 문서의 모듈 섹션을 참조하세요.

자식 범위가 만들어지면 AllScope 옵션이 있는 모든 별칭 및 변수와 일부 자동 변수가 포함됩니다. 이 옵션은 이 문서의 뒷부분에서 설명합니다.

항목을 명시적으로 비공개로 만들지 않는 한 부모 범위의 항목을 자식 범위에서 사용할 수 있습니다. 항목을 만들 때 범위를 명시적으로 지정하지 않는 한 자식 범위에서 만들거나 변경하는 항목은 부모 범위에 영향을 주지 않습니다.

특정 범위에서 항목을 찾으려면 범위 매개 변수 또는 Get-VariableGet-Alias.

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

Get-Variable -Scope local

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

Get-Variable -Scope global

변수, 별칭 또는 함수를 참조하는 경우 PowerShell은 현재 범위를 검색합니다. 항목을 찾을 수 없으면 부모 범위가 검색됩니다. 이 검색은 전역 범위까지 반복됩니다. 변수가 부모 범위에서 프라이빗인 경우 범위 체인을 통해 검색이 계속됩니다. 예제 4 에서는 범위 검색에서 프라이빗 변수의 효과를 보여 있습니다.

PowerShell 범위 이름

PowerShell은 해당 범위에 더 쉽게 액세스할 수 있도록 일부 범위에 대한 이름을 정의합니다. PowerShell은 다음과 같은 명명된 범위를 정의합니다.

  • 전역: PowerShell이 시작되거나 새 세션 또는 Runspace를 만들 때 적용되는 범위입니다. 자동 변수 및 기본 설정 변수와 같이 PowerShell이 시작될 때 존재하는 변수 및 함수는 전역 범위에서 만들어집니다. PowerShell 프로필의 변수, 별칭 및 함수도 전역 범위에서 만들어집니다. 전역 범위는 Runspace의 루트 부모 범위입니다.
  • 로컬: 현재 범위입니다. 로컬 범위는 전역 범위 또는 다른 범위일 수 있습니다.
  • 스크립트: 스크립트 파일이 실행되는 동안 생성되는 범위입니다. 스크립트의 명령은 스크립트 범위에서 실행됩니다. 스크립트의 명령에 대해 스크립트 범위는 로컬 범위입니다.

범위를 지원하는 cmdlet의 경우 한 범위의 상대 위치를 다른 범위로 설명하는 숫자로 범위를 참조할 수 있습니다. 범위 0은 현재(로컬) 범위를 나타냅니다. 범위 1은 현재 범위의 부모이고, 범위 2는 현재 범위의 조부모입니다. 이 패턴은 루트 범위에 도달할 때까지 계속됩니다.

범위 한정자

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

  • global:- 이름이 전역 범위에 있음을 지정합니다.

  • local:- 이름이 로컬 범위에 있음을 지정합니다. 현재 범위는 항상 로컬 범위입니다.

  • private:- 이름이 Private이고 현재 범위에만 표시되도록 지정합니다.

    참고 항목

    private: 은 범위가 아닙니다. 정의된 범위 외부에 있는 항목의 접근성을 변경하는 옵션입니다.

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

  • using: - 같은 Start-JobInvoke-Commandcmdlet을 통해 스크립트를 실행하는 동안 다른 범위에 정의된 변수에 액세스하는 데 사용됩니다.

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

  • <variable-namespace> - PowerShell PSDrive 공급자가 만든 한정자입니다. 예시:

    네임스페이스 설명
    Alias: 현재 범위에 정의된 별칭
    Env: 현재 범위에 정의된 환경 변수
    Function: 현재 범위에 정의된 함수
    Variable: 현재 범위에 정의된 변수

스크립트의 기본 범위는 스크립트 범위입니다. 함수 및 별칭의 기본 범위는 스크립트에 정의된 경우에도 로컬 범위입니다.

범위 한정자 사용

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

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

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

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

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

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

$a = "one"

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

$global:a = "one"
Get-Variable a | Format-List *

VisibilityOptions 속성 값을 확인합니다.

Name        : a
Description :
Value       : one
Visibility  : Public
Module      :
ModuleName  :
Options     : None
Attributes  : {}

이를 프라이빗 변수와 비교합니다.

$private:pVar = 'Private variable'
Get-Variable pVar | Format-List *

범위 한 private 정자를 사용하면 Options 속성이 .로 설정됩니다Private.

Name        : pVar
Description :
Value       : Private variable
Visibility  : Public
Module      :
ModuleName  :
Options     : Private
Attributes  : {}

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

$script:a = "one"

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

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

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

$test
$global:test

using: 범위 한정자

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

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

세션 외부에서 실행되는 모든 스크립트 또는 명령의 경우 외부 세션 코드에서 액세스할 수 있도록 호출 세션 범위의 변수 값을 포함하려면 범위 한정자가 필요합니다 using . using 범위 한정자는 다음 컨텍스트에서 지원됩니다.

  • ComputerName, HostName, SSH커넥트ion 또는 세션 매개 변수 사용으로 시작된 Invoke-Command 원격 실행 명령(원격 세션)
  • 백그라운드 작업, 시작( Start-Job Out-of-process 세션)
  • 스레드 작업, 또는 (별도의 스레드 세션)을 통해 Start-ThreadJobForEach-Object -Parallel 시작됨

컨텍스트에 따라 포함된 변수 값은 호출자의 범위에 있는 데이터의 독립적인 복사본이거나 해당 데이터에 대한 참조입니다. 원격 및 Out-of-process 세션에서는 항상 독립적인 복사본입니다.

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

스레드 세션에서는 참조로 전달됩니다. 즉, 다른 스레드에서 자식 범위 변수를 수정할 수 있습니다. 변수를 안전하게 수정하려면 스레드 동기화가 필요합니다.

자세한 내용은 다음을 참조하십시오.

변수 값의 serialization

원격으로 실행된 명령 및 백그라운드 작업은 out-of-process로 실행됩니다. Out-of-process 세션은 XML 기반 직렬화 및 역직렬화를 사용하여 프로세스 경계를 넘어 변수 값을 사용할 수 있도록 합니다. serialization 프로세스는 개체를 원래 개체 속성을 포함하지만 메서드는 포함하지 않는 PSObject 로 변환합니다.

제한된 형식 집합의 경우 역직렬화는 개체를 원래 형식으로 다시 전송합니다. 리하이딩된 개체는 원래 개체 인스턴스의 복사본입니다. 형식 속성과 메서드가 있습니다. System.Version과 같은 단순 형식의 경우 복사본이 정확합니다. 복합 형식의 경우 복사본이 불완전합니다. 예를 들어 리하이딩된 인증서 개체에는 프라이빗 키가 포함되지 않습니다.

다른 모든 형식의 인스턴스는 PSObject 인스턴스입니다. PSTypeNames 속성에는 역직렬화(예: Deserialized.System.Data.DataTable)가 접두사로 지정된 원래 형식 이름이 포함됩니다.

AllScope 옵션

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

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

범위 관리

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

Get-Help * -Parameter scope

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

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

Get-Variable -Scope local

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

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

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

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

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

참고 항목

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

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

스크립트 및 함수는 범위 규칙을 따릅니다. 특정 범위에서 만들면 cmdlet 매개 변수 또는 범위 한정자를 사용하여 해당 범위를 변경하지 않는 한 해당 범위에만 적용됩니다.

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

예를 들어 스크립트 범위(스크립트의 C:\Scripts 기본값)의 디렉터리에서 스크립트를 실행 Sample.ps1 하려면 명령줄에서 스크립트 파일의 전체 경로를 입력하면 됩니다.

c:\scripts\sample.ps1

스크립트 파일에는 .ps1 실행 가능한 파일 확장명이 있어야 합니다. 경로에 공백이 있는 파일은 따옴표로 묶어야 합니다. 따옴표 붙은 경로를 실행하려고 하면 PowerShell은 스크립트를 실행하는 대신 따옴표 붙은 문자열의 내용을 표시합니다. 호출 연산자(&)를 사용하면 파일 이름을 포함하는 문자열의 내용을 실행할 수 있습니다.

호출 연산자를 사용하여 함수 또는 스크립트를 실행하면 스크립트 범위에서 실행됩니다. 호출 연산자를 사용하는 것은 이름으로 스크립트를 실행하는 것과 다르지 않습니다.

& c:\scripts\sample.ps1

about_Operators 호출 연산 자에 대한 자세한 내용을 확인할 수 있습니다.

로컬 범위에서 스크립트를 Sample.ps1 실행하려면 스크립트 경로 앞에 점과 공백(. )을 입력합니다.

. c:\scripts\sample.ps1

이제 스크립트에 정의된 모든 함수, 별칭 또는 변수가 현재 범위에 추가됩니다.

범위 없이 제한

PowerShell에는 범위와 유사하고 범위와 상호 작용할 수 있는 몇 가지 옵션과 기능이 있습니다. 이러한 기능은 범위 또는 범위의 동작과 혼동될 수 있습니다.

세션, 모듈 및 중첩 프롬프트는 세션의 전역 범위의 자식 범위가 아닌 자체 포함 환경입니다.

세션

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

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

모듈

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

기본적으로 모듈은 Runspace의 루트 수준(전역) 범위에 로드됩니다. 모듈을 가져오면 범위가 변경되지 않습니다. 세션 내에서 모듈에는 고유한 범위가 있습니다. 다음 모듈 C:\temp\mod1.psm1을 고려합니다.

$a = "Hello"

function foo {
    "`$a = $a"
    "`$global:a = $global:a"
}

이제 전역 변수 $a를 만들고 값을 지정하고 함수 foo를 호출합니다.

$a = "Goodbye"
foo

모듈은 모듈 범위에서 변수 $a 를 선언한 다음, 함수 foo 는 두 범위에서 변수 값을 출력합니다.

$a = Hello
$global:a = Goodbye

모듈은 가져온 범위에 연결된 병렬 범위 컨테이너를 만듭니다. 모듈에서 내보낸 항목은 가져온 범위 수준에서 시작하여 사용할 수 있습니다. 모듈에서 내보내지 않은 항목은 모듈의 범위 컨테이너 내에서만 사용할 수 있습니다. 모듈의 함수는 가져온 범위의 항목과 모듈의 범위 컨테이너에 있는 항목에 액세스할 수 있습니다.

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

중첩 프롬프트

중첩된 프롬프트에는 자체 범위가 없습니다. 중첩 프롬프트를 입력하면 중첩된 프롬프트가 환경의 하위 집합입니다. 하지만 로컬 범위 내에 기본 있습니다.

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

프라이빗 옵션

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

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

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

표시

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

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

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

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

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

예제

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

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

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

PS>  $ConfirmPreference
High

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

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

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

The value of $ConfirmPreference is Low.

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

PS>  $ConfirmPreference
High

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

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

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

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

$test = "Global"

다음으로 변수를 Sample.ps1 정의하는 스크립트를 $test 만듭니다. 스크립트에서 범위 한정자를 사용하여 변수의 전역 또는 로컬 버전을 참조합니다 $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 옵션 또는 다른 메서드를 사용하여 항목을 보호하지 않는 한 부모 범위에서 변수 값을 보고 변경할 수 있습니다.

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

$test = "Global"

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

Sample.ps1에서:

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

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

PS> $test
Local

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

범위 한정자를 사용하거나 Option 속성이 <>private:/>로 설정된 변수를 만들어 변수를 비공개로 만들 수 있습니다Private. 프라이빗 변수는 생성된 범위에서만 보거나 변경할 수 있습니다.

이 예제에서 스크립트는 ScopeExample.ps1 5개의 함수를 만듭니다. 첫 번째 함수는 자식 범위를 만드는 다음 함수를 호출합니다. 함수 중 하나에는 만들어진 범위에서만 볼 수 있는 프라이빗 변수가 있습니다.

PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
    "Setting `$funcAVar1 to 'Value set in funcA'"
    $funcAVar1 = "Value set in funcA"
    funcB
}

function funcB {
    "In funcB before set -> '$funcAVar1'"
    $private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
    "In funcB after set  -> '$funcAVar1'"
    funcC
}

function funcC {
    "In funcC before set -> '$funcAVar1' - should be the value set in funcA"
    $funcAVar1 = "Value set in funcC - Child scopes can see this change."
    "In funcC after set  -> '$funcAVar1'"
    funcD
}

function funcD {
    "In funcD before set -> '$funcAVar1' - should be the value from funcC."
    $funcAVar1 = "Value set in funcD"
    "In funcD after set  -> '$funcAVar1'"
    '-------------------'
    ShowScopes
}

function ShowScopes {
    $funcAVar1 = "Value set in ShowScopes"
    "Scope [0] (local)  `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
    "Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
    "Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
    "Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
    "Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1

출력에는 각 범위의 변수 값이 표시됩니다. 프라이빗 변수가 만들어진 범위에서 funcB만 표시되는 것을 볼 수 있습니다.

Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set  -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set  -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set  -> 'Value set in funcD'
-------------------
Scope [0] (local)  $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'

출력에 ShowScopes표시된 것처럼 범위 번호를 사용하고 Get-Variable 지정하여 다른 범위의 변수에 액세스할 수 있습니다.

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

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

구문은 다음과 같습니다.

$using:<VariableName>

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

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

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

참고 항목