Udostępnij za pośrednictwem


about_PSModulePath

Krótki opis

W tym artykule opisano przeznaczenie i użycie zmiennej środowiskowej $env:PSModulePath .

Długi opis

Zmienna $env:PSModulePath środowiskowa zawiera listę lokalizacji folderów. Program PowerShell cyklicznie wyszukuje każdy folder dla plików modułu (.psd1 lub .psm1).

Domyślnie obowiązującą lokalizacją przypisaną do $env:PSModulePath :

  • Moduły zainstalowane w zakresie CurrentUser :
    • W systemie Windows te moduły są przechowywane w programie $HOME\Documents\PowerShell\Modules. Określona lokalizacja Documents folderu różni się w zależności od wersji systemu Windows i podczas korzystania z przekierowania folderów. Ponadto usługa Microsoft OneDrive może zmienić lokalizację Documents folderu. Aby sprawdzić lokalizację Documents folderu, uruchom następujące polecenie: [Environment]::GetFolderPath('MyDocuments').
    • W systemach innych niż Windows te moduły są przechowywane w folderze $HOME/.local/share/powershell/Modules .
  • Moduły zainstalowane w zakresie AllUsers :
    • W systemie Windows te moduły są przechowywane w programie $env:ProgramFiles\PowerShell\Modules.
    • W systemach innych niż Windows te moduły są przechowywane w programie /usr/local/share/powershell/Modules.
  • Moduły dostarczane za pomocą programu PowerShell są przechowywane w programie $PSHOME\Modules.

Uwaga

Aplikacje zawierające moduły programu PowerShell mogą instalować moduły w innych katalogach w systemie Windows, takich jak Program Files folder. Pakiet instalatora może nie dołączać lokalizacji do pliku $env:PSModulePath.

Domyślne lokalizacje programu Windows PowerShell 5.1 różnią się od programu PowerShell 7.

  • Moduły zainstalowane w zakresie CurrentUser są przechowywane w programie $HOME\Documents\WindowsPowerShell\Modules.
  • Moduły zainstalowane w zakresie AllUsers są przechowywane w folderze $env:ProgramFiles\WindowsPowerShell\Modules.
  • Moduły dostarczane za pomocą programu Windows PowerShell przechowywane w $PSHOME\Modulesprogramie , czyli $env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.

Konstrukcja programu PowerShell PSModulePath

Wartość jest tworzona $env:PSModulePath za każdym razem, gdy program PowerShell jest uruchamiany. Wartość różni się w zależności od wersji programu PowerShell i sposobu jej uruchamiania.

Uruchamianie programu Windows PowerShell

Program Windows PowerShell używa następującej logiki do konstruowania podczas uruchamiania PSModulePath :

  • Jeśli PSModulePath nie istnieje, połącz ścieżki CurrentUser, AllUsers i $PSHOME modułów
  • Jeśli PSModulePath istnieje:
    • Jeśli PSModulePath zawiera $PSHOME ścieżkę modułów:
      • Ścieżka modułów AllUsers jest wstawiana przed $PSHOME ścieżką modułów
    • inaczej:
      • Po prostu użyj PSModulePath jako zdefiniowanego, ponieważ użytkownik celowo usunął lokalizację $PSHOME

Ścieżka modułu CurrentUser jest poprzedzona prefiksem tylko wtedy, gdy zakres $env:PSModulePath użytkownika nie istnieje. W przeciwnym razie zakres $env:PSModulePath użytkownika jest używany zgodnie z definicją.

Uruchamianie programu PowerShell 7

W systemie Windows w przypadku większości zmiennych środowiskowych, jeśli istnieje zmienna o zakresie użytkownika, nowy proces używa tej wartości tylko wtedy, gdy istnieje zmienna o zakresie maszyny o tej samej nazwie. Zmienne środowiskowe ścieżki są traktowane inaczej.

W systemie Windows PSModulePath jest traktowany podobnie jak w przypadku traktowania zmiennej środowiskowej Path . Path jest traktowany inaczej niż inne zmienne środowiskowe. Po uruchomieniu procesu system Windows łączy zakres użytkownika Path z zakresem Pathmaszyny .

  • Pobieranie zakresu użytkownika PSModulePath
  • Porównanie z dziedziczonej PSModulePath zmiennej środowiskowej procesu
    • Jeśli to samo:
      • Dołącz wartość AllUsers PSModulePath na końcu po semantyce zmiennej środowiskowej Path
      • Ścieżka systemu Windows System32 pochodzi ze zdefiniowanej PSModulePath maszyny, więc nie trzeba ich jawnie dodawać
    • Jeśli jest inaczej, traktuj je tak, jakby użytkownik jawnie go zmodyfikował i nie dołączaj użytkowników AllUsers PSModulePath
  • Prefiks z ps7 użytkownika, systemu i $PSHOME ścieżek w tej kolejności
    • Jeśli powershell.config.json zawiera użytkownika o PSModulePathokreślonym zakresie , użyj tego zamiast wartości domyślnej dla użytkownika
    • Jeśli powershell.config.json zawiera system o PSModulePathzakresie , należy użyć tego zamiast domyślnego dla systemu

Systemy inne niż Windows nie mają separacji zmiennych środowiskowych użytkownika i systemu. PSModulePath jest dziedziczony, a ścieżki specyficzne dla programu PS7 są poprzedzone prefiksem, jeśli jeszcze nie zostały zdefiniowane.

Uruchamianie programu Windows PowerShell z poziomu programu PowerShell 7

Na potrzeby tej dyskusji program Windows PowerShell oznacza zarówno , jak powershell.exe i powershell_ise.exe.

Wartość $env:PSModulePath elementu jest kopiowana do WinPSModulePath elementu z następującymi modyfikacjami:

  • Usuwanie ps7 ścieżki modułu User
  • Usuwanie ps7 ścieżki modułu systemowego
  • Usuwanie ścieżki modułu $PSHOME PS7

Ścieżki PS7 są usuwane, aby moduły PS7 nie zostały załadowane w programie Windows PowerShell. Wartość jest używana podczas uruchamiania WinPSModulePath programu Windows PowerShell.

Uruchamianie programu PowerShell 7 z poziomu programu Windows PowerShell

Uruchamianie programu PowerShell 7 jest kontynuowane w miarę dodawania dziedziczych ścieżek dodanych przez program Windows PowerShell. Ponieważ ścieżki specyficzne dla ps7 są poprzedzone prefiksem, nie ma problemu z funkcjonalnością.

Zachowanie wyszukiwania modułu

Program PowerShell cyklicznie wyszukuje każdy folder w folderze PSModulePath dla plików modułu (.psd1 lub .psm1). Ten wzorzec wyszukiwania umożliwia zainstalowanie wielu wersji tego samego modułu w różnych folderach. Na przykład:

    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

Domyślnie program PowerShell ładuje najwyższy numer wersji modułu po znalezieniu wielu wersji. Aby załadować określoną wersję, użyj parametru Import-Module FullyQualifiedName . Aby uzyskać więcej informacji, zobacz Import-Module.

Modyfikowanie ścieżki PSModulePath

W większości sytuacji należy instalować moduły w domyślnych lokalizacjach modułów. Może jednak być konieczne zmianę wartości zmiennej środowiskowej PSModulePath .

Aby na przykład tymczasowo dodać C:\Program Files\Fabrikam\Modules katalog do $env:PSModulePath bieżącej sesji, wpisz:

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

Średnik (;) w poleceniu oddziela nową ścieżkę od ścieżki, która poprzedza ją na liście. Na platformach innych niż Windows dwukropek (:) oddziela lokalizacje ścieżek w zmiennej środowiskowej.

Modyfikowanie ścieżki PSModulePath w systemach innych niż Windows

Aby zmienić wartość PSModulePath dla każdej sesji w środowisku innych niż Windows, dodaj poprzednie polecenie do profilu programu PowerShell.

Modyfikowanie ścieżki PSModulePath w systemie Windows

Aby zmienić wartość PSModulePath w każdej sesji, zmodyfikuj klucz rejestru przechowując PSModulePath wartości. Wartości PSModulePath są przechowywane w rejestrze jako niezrozpaczone ciągi. Aby uniknąć trwałego zapisywania PSModulePath wartości jako rozszerzonych ciągów, użyj GetValue() metody w podkluczu i edytuj wartość bezpośrednio.

Poniższy przykład dodaje ścieżkę C:\Program Files\Fabrikam\Modules do wartości PSModulePath zmiennej środowiskowej bez rozszerzania niezrozpaczone ciągi.

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

Aby dodać ścieżkę do ustawienia użytkownika, użyj następującego kodu:

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

Zobacz też