about_PSModulePath
Zmienna środowiskowa $env:PSModulePath
zawiera listę lokalizacji folderów, które są przeszukiwane w celu znalezienia modułów i zasobów. Program PowerShell cyklicznie wyszukuje każdy folder dla plików modułu (.psd1
lub .psm1
).
Domyślnie obowiązujące lokalizacje przypisane do $env:PSModulePath
to:
Lokalizacje dla całego systemu: te foldery zawierają moduły dostarczane za pomocą programu PowerShell. Te moduły są przechowywane w folderze
$PSHOME\Modules
. Jest to również lokalizacja, w której są zainstalowane moduły zarządzania systemem Windows.Moduły zainstalowane przez użytkownika: są to moduły zainstalowane przez użytkownika.
ma parametr zakresu , który umożliwia określenie, czy moduł jest zainstalowany dla bieżącego użytkownika, czy dla wszystkich użytkowników. Aby uzyskać więcej informacji, zobacz Install-Module. - W systemie Windows lokalizacja zakresu Current User specyficznego dla użytkownika jest folderem
$HOME\Documents\PowerShell\Modules
. Lokalizacja zakresu AllUsers jest$env:ProgramFiles\PowerShell\Modules
. - W systemach innych niż Windows lokalizacja określonego przez użytkownika CurrentUser zakres jest folderem
$HOME/.local/share/powershell/Modules
. Lokalizacja zakresu AllUsers jest/usr/local/share/powershell/Modules
.
- W systemie Windows lokalizacja zakresu Current User specyficznego dla użytkownika jest folderem
Ponadto programy instalacyjne, które instalują moduły w innych katalogach, takich jak katalog Program Files, mogą dołączać ich lokalizacje do wartości $env:PSModulePath
.
Nuta
W systemie Windows lokalizacja specyficzna dla użytkownika to folder PowerShell\Modules
znajdujący się w folderze Documents w profilu użytkownika. Określona ścieżka tej lokalizacji różni się w zależności od wersji systemu Windows i tego, czy używasz przekierowania folderów. Usługa Microsoft OneDrive może również zmienić lokalizację folderu Documents. Możesz sprawdzić lokalizację folderu Documents przy użyciu następującego polecenia: [Environment]::GetFolderPath('MyDocuments')
.
Konstrukcja programu PowerShell PSModulePath
Wartość $env:PSModulePath
jest tworzona przy każdym uruchomieniu programu PowerShell.
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 PSModulePath
podczas uruchamiania:
- Jeśli
PSModulePath
nie istnieje, połącz CurrentUser, AllUsersi ścieżki modułów$PSHOME
- Jeśli
PSModulePath
istnieje:- Jeśli
PSModulePath
zawiera ścieżkę modułów$PSHOME
:- ścieżka modułów AllUsers jest wstawiana przed ścieżką modułów
$PSHOME
- ścieżka modułów AllUsers jest wstawiana przed ścieżką modułów
- inaczej:
- Po prostu użyj
PSModulePath
zgodnie z definicją, ponieważ użytkownik celowo usunął lokalizację$PSHOME
- Po prostu użyj
- Jeśli
Ścieżka modułu CurrentUser jest poprzedzona prefiksem tylko wtedy, gdy zakres użytkownika $env:PSModulePath
nie istnieje. W przeciwnym razie zakres użytkownika $env:PSModulePath
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.
W programie PowerShell 7 PSModulePath
jest traktowany podobnie do sposobu traktowania zmiennej środowiskowej Path
w systemie Windows. W systemie Windows Path
jest traktowana inaczej niż inne zmienne środowiskowe. Po uruchomieniu procesu system Windows łączy Path
o zakresie użytkownika z Path
o zakresie maszyny.
- Pobieranie
PSModulePath
o zakresie użytkownika - Porównanie z dziedziczonej
PSModulePath
zmiennej środowiskowej procesu- Jeśli to samo:
- Dołącz AllUsers
PSModulePath
na końcu po semantyce zmiennej środowiskowejPath
- Ścieżka
System32
systemu Windows pochodzi ze zdefiniowanejPSModulePath
maszyny, dlatego nie trzeba ich jawnie dodawać
- Dołącz AllUsers
- Jeśli jest inaczej, traktuj go tak, jakby użytkownik jawnie go zmodyfikował i nie dołączaj AllUsers
PSModulePath
- Jeśli to samo:
- Prefiks z ścieżkami użytkownika, systemu i
$PSHOME
PS7 w tej kolejności- Jeśli
powershell.config.json
zawieraPSModulePath
o zakresie użytkownika, użyj tego zamiast wartości domyślnej dla użytkownika - Jeśli
powershell.config.json
zawieraPSModulePath
o zakresie systemu, należy użyć tej wartości zamiast domyślnej dla systemu
- Jeśli
Systemy Unix nie mają separacji zmiennych środowiskowych użytkownika i systemu.
PSModulePath
jest dziedziczona, a ścieżki specyficzne dla programu PS7 są poprzedzone prefiksem, jeśli nie zostały jeszcze zdefiniowane.
Uruchamianie programu Windows PowerShell z poziomu programu PowerShell 7
W tej dyskusji program Windows PowerShell oznacza zarówno powershell.exe
, jak i powershell_ise.exe
.
Wartość $env:PSModulePath
jest kopiowana do WinPSModulePath
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ść WinPSModulePath
jest używana podczas uruchamiania programu Windows PowerShell.
Uruchamianie programu PowerShell 7 z poziomu programu Windows PowerShell
Uruchamianie programu PowerShell 7 jest kontynuowane as-is z dodatkiem 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 plikach PSModulePath
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 Import-Module
z parametrem FullyQualified Name. 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ć katalog C:\Program Files\Fabrikam\Modules
do $env:PSModulePath
dla 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
dla każdej sesji w środowisku systemu Windows, edytuj klucz rejestru przechowując wartości PSModulePath
. Wartości PSModulePath
są przechowywane w rejestrze jako nieuwzroszonych ciągów. Aby uniknąć trwałego zapisywania wartości PSModulePath
jako rozszerzonych ciągów, użyj metody GetValue na kluczu podrzędnym i edytuj wartość bezpośrednio.
Poniższy przykład dodaje ścieżkę C:\Program Files\Fabrikam\Modules
do wartości zmiennej środowiskowej PSModulePath
bez rozszerzania ciągów bez rozszerzania.
$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';C:\Program Files\Fabrikam\Modules' # or '%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Aby dodać ścieżkę do ustawienia użytkownika, zmień dostawcę rejestru z HKLM:\
na HKCU:\
.
$key = (Get-Item 'HKCU:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';C:\Program Files\Fabrikam\Modules' # or '%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Zobacz też
- about_Modules
- metod środowiska