about_PSModulePath

간단한 설명

이 문서에서는 환경 변수의 용도 및 사용에 대해 $env:PSModulePath 설명합니다.

자세한 설명

환경 변수에는 $env:PSModulePath 모듈 및 리소스를 찾기 위해 검색되는 폴더 위치 목록이 포함됩니다. PowerShell은 각 폴더에서 모듈(.psd1 또는 .psm1) 파일을 재귀적으로 검색합니다.

Install-Module 에는 현재 사용자 또는 모든 사용자에 대해 모듈이 설치되어 있는지 여부를 지정할 수 있는 Scope 매개 변수가 있습니다. 자세한 내용은 모듈 설치를 참조하세요.

기본적으로 할당된 $env:PSModulePath 유효 위치는 다음과 같습니다.

  • 시스템 전체 위치: 이러한 폴더에는 PowerShell과 함께 제공되는 모듈이 포함되어 있습니다. 이러한 모듈은 폴더에 $PSHOME\Modules 저장됩니다.

    • Windows에서는 AllUsers 범위에 설치된 모듈이 에 $env:ProgramFiles\WindowsPowerShell\Modules저장됩니다.
    • Windows가 아닌 시스템에서는 AllUsers 범위에 설치된 모듈이 에 /usr/local/share/powershell/Modules저장됩니다.
  • 사용자가 설치한 모듈: Windows에서는 CurrentUser 범위에 설치된 모듈이 일반적으로 폴더에 $HOME\Documents\WindowsPowerShell\Modules 저장됩니다. 폴더의 Documents 특정 위치는 Windows 버전 및 폴더 리디렉션을 사용하는 경우에 따라 다릅니다. 또한 Microsoft OneDrive는 폴더의 위치를 변경할 수 있습니다 Documents . 다음 명령을 [Environment]::GetFolderPath('MyDocuments')사용하여 폴더의 Documents 위치를 확인할 수 있습니다.

    Windows가 아닌 시스템에서는 CurrentUser 범위에 설치된 모듈이 폴더에 $HOME/.local/share/powershell/Modules 저장됩니다.

  • 애플리케이션 관련 모듈: 설치 프로그램은 Windows의 폴더와 같은 다른 디렉터리에 모듈을 설치할 Program Files 수 있습니다. 설치 관리자 패키지는 위치를 $env:PSModulePath에 추가하거나 추가하지 않을 수 있습니다.

PowerShell PSModulePath 생성

$env:PSModulePath 은 PowerShell이 시작될 때마다 생성됩니다. 값은 PowerShell 버전 및 시작 방법에 따라 다릅니다.

Windows PowerShell 시작

Windows PowerShell은 다음 논리를 사용하여 시작 시 생성합니다 PSModulePath .

  • 존재하지 않는 경우 PSModulePath CurrentUser, AllUsers$PSHOME 모듈 경로를 결합합니다.
  • 있는 경우 PSModulePath :
    • 모듈 경로가 $PSHOME 포함된 경우PSModulePath:
      • AllUsers 모듈 경로가 모듈 경로 앞에 $PSHOME 삽입됨
    • 다른:
      • 사용자가 의도적으로 위치를 제거한 $PSHOME 후에 정의된 대로만 사용 PSModulePath

CurrentUser 모듈 경로는 사용자 범위 $env:PSModulePath 가 없는 경우에만 접두사로 지정됩니다. 그렇지 않으면 사용자 범위 $env:PSModulePath 가 정의된 대로 사용됩니다.

PowerShell 7 시작

Windows에서 대부분의 환경 변수에 대해 사용자 범위 변수가 있는 경우 새 프로세스는 동일한 이름의 컴퓨터 범위 변수가 있는 경우에만 해당 값을 사용합니다.

PowerShell 7 PSModulePath 에서는 Windows에서 환경 변수를 Path 처리하는 방법과 유사하게 처리됩니다. Windows에서는 Path 다른 환경 변수와 다르게 처리됩니다. 프로세스가 시작되면 Windows는 사용자 범위와 컴퓨터 범위를 Path 결합합니다 Path.

  • 사용자 범위 검색 PSModulePath
  • 상속된 PSModulePath 환경 변수 처리 비교
    • 동일한 경우:
      • 환경 변수의 의미 체계에 따라 끝에 AllUsersPSModulePath 추가 Path
      • Windows System32 경로는 정의된 PSModulePath 컴퓨터에서 제공되므로 명시적으로 추가할 필요가 없습니다.
    • 다른 경우 사용자가 명시적으로 수정한 것처럼 처리하고 AllUsers를 추가 하지 않습니다.PSModulePath
  • PS7 사용자, 시스템 및 $PSHOME 경로가 해당 순서대로 포함된 접두사
    • 범위PSModulePath가 지정된 사용자가 포함된 경우 powershell.config.json 사용자의 기본값 대신 사용합니다.
    • 시스템 범위PSModulePath가 포함된 경우 powershell.config.json 시스템의 기본값 대신 사용합니다.

Unix 시스템에는 사용자 및 시스템 환경 변수가 분리되어 있지 않습니다. PSModulePath 가 상속되고 PS7 관련 경로는 아직 정의되지 않은 경우 접두사로 지정됩니다.

PowerShell 7에서 Windows PowerShell 시작

이 설명에서는 Windows PowerShell 이 둘 다 powershell.exe 의미하고 powershell_ise.exe.

$env:PSModulePath 은 다음과 같은 수정 사항으로 복사 WinPSModulePath 됩니다.

  • PS7 사용자 모듈 경로 제거
  • PS7 시스템 모듈 경로 제거
  • 모듈 경로 PS7 $PSHOME 제거

PS7 모듈이 Windows PowerShell에 로드되지 않도록 PS7 경로가 제거됩니다. 이 WinPSModulePath 값은 Windows PowerShell을 시작할 때 사용됩니다.

Windows PowerShell에서 PowerShell 7 시작

PowerShell 7 시작은 Windows PowerShell에서 추가한 상속 경로를 추가하여 그대로 계속됩니다. PS7 관련 경로는 접두사이므로 기능 문제가 없습니다.

모듈 검색 동작

PowerShell은 PSModulePath각 폴더에서 모듈(.psd1또는.psm1) 파일을 재귀적으로 검색합니다. 이 검색 패턴을 사용하면 동일한 모듈의 여러 버전을 다른 폴더에 설치할 수 있습니다. 예시:

    Directory: C:\Program Files\WindowsPowerShell\Modules\PowerShellGet

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           8/14/2020  5:56 PM                1.0.0.1
d----           9/13/2019  3:53 PM                2.1.2

기본적으로 PowerShell은 여러 버전이 발견되면 모듈의 가장 높은 버전 번호를 로드합니다. 특정 버전을 로드하려면 FullyQualifiedName 매개 변수와 함께 사용합니다Import-Module. 자세한 내용은 Import-Module을 참조 하세요.

PSModulePath 수정

대부분의 경우 기본 모듈 위치에 모듈을 설치해야 합니다. 그러나 환경 변수의 PSModulePath 값을 변경해야 할 수도 있습니다.

예를 들어 현재 세션에 C:\Program Files\Fabrikam\Modules 대한 디렉터리를 $env:PSModulePath 일시적으로 추가하려면 다음을 입력합니다.

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

명령의 세미콜론(;)은 새 경로를 목록의 앞에 오는 경로와 구분합니다. 비 Windows 플랫폼에서 콜론(:)은 환경 변수의 경로 위치를 구분합니다.

비 Windows에서 PSModulePath 수정

Windows가 아닌 환경의 PSModulePath 모든 세션에 대한 값을 변경하려면 PowerShell 프로필에 이전 명령을 추가합니다.

Windows에서 PSModulePath 수정

모든 세션의 PSModulePath 값을 변경하려면 값을 저장하는 레지스트리 키를 편집합니다 PSModulePath . 값은 PSModulePath 레지스트리에 연결되지 않은 문자열로 저장됩니다. 값을 확장된 문자열로 영구적으로 저장 PSModulePath 하지 않도록 하려면 하위 키에서 GetValue 메서드를 사용하고 값을 직접 편집합니다.

다음은 확장되지 않은 문자열을 확장하지 않고 환경 변수 값 PSModulePath 에 경로를 추가하는 C:\Program Files\Fabrikam\Modules 예제입니다.

$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

사용자 설정에 대한 경로를 추가하려면 레지스트리 공급자를 .로 HKLM:\ 변경합니다 HKCU:\.

$key = (Get-Item 'HKCU:\').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

참고 항목