Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Krótki opis
W tym artykule opisano przeznaczenie i użycie zmiennej środowiskowej $Env:PSModulePath.
Długi opis
Zmienna środowiskowa $Env:PSModulePath zawiera listę lokalizacji folderó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:
- Moduły zainstalowane w zakresie CurrentUser:
- W systemie Windows te moduły są przechowywane w
$HOME\Documents\PowerShell\Modules. Określona lokalizacja folderuDocumentsróż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ę folderuDocuments. Aby sprawdzić lokalizację folderuDocuments, 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.
- W systemie Windows te moduły są przechowywane w
- Moduły zainstalowane w obszarze AllUsers:
- W systemie Windows te moduły są przechowywane w
$Env:ProgramFiles\PowerShell\Modules. - W systemach innych niż Windows te moduły są przechowywane w
/usr/local/share/powershell/Modules.
- W systemie Windows te moduły są przechowywane w
- Moduły dostarczane za pomocą programu PowerShell są przechowywane w
$PSHOME\Modules.
Notatka
Aplikacje zawierające moduły programu PowerShell mogą instalować moduły w innych katalogach w systemie Windows, takich jak folder Program Files. Pakiet instalatora może nie dołączać lokalizacji do $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
$HOME\Documents\WindowsPowerShell\Modules. - Moduły zainstalowane w zakresie AllUsers są przechowywane w
$Env:ProgramFiles\WindowsPowerShell\Modules. - Moduły dostarczane z programem Windows PowerShell są przechowywane w
$PSHOME\Modules, który jest$Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.
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
PSModulePathnie istnieje, połącz ścieżki modułów CurrentUser, AllUsersi$PSHOME - Jeśli
PSModulePathistnieje:- Jeśli
PSModulePathzawiera ś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
PSModulePathzgodnie 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 dla większości zmiennych środowiskowych, jeśli istnieje zmienna o zakresie użytkownika, nowy proces używa tylko tej wartości, nawet jeśli istnieje zmienna o zakresie maszyny o tej samej nazwie. Zmienne środowiskowe ścieżki są traktowane inaczej.
W systemie Windows PSModulePath jest traktowana podobnie do sposobu traktowania zmiennej środowiskowej Path.
Path jest traktowana inaczej niż inne zmienne środowiskowe. Po uruchomieniu procesu system Windows łączy Path o zakresie użytkownika z Patho zakresie maszyny.
- Pobierz
PSModulePathw zakresie użytkownika - Porównanie z dziedziczonej
PSModulePathzmiennej środowiskowej procesu- Jeśli to samo:
- Dołącz AllUsers
PSModulePathna końcu zgodnie z semantyką zmiennej środowiskowejPATH - Ścieżka
System32systemu Windows pochodzi z maszyny zdefiniowanej jakoPSModulePath, więc nie trzeba jej dodawać jawnie.
- 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 do ścieżek PS7 użytkownika, systemu i
$PSHOMEw tej kolejności- Jeśli
powershell.config.jsonzawieraPSModulePatho zakresie użytkownika, użyj tego zamiast wartości domyślnej dla użytkownika - Jeśli
powershell.config.jsonzawieraPSModulePathprzypisane do zakresu systemu, użyj tej wartości zamiast domyślnej dla systemu.
- Jeśli
Systemy inne niż Windows nie mają separacji zmiennych środowiskowych użytkownika i systemu.
PSModulePath jest dziedziczone, a ścieżki specyficzne dla 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:
- Usuń ścieżkę modułu użytkownika PS7
- Usuwanie ścieżki modułu systemowego PS7
- Usuń ścieżkę modułu
$PSHOMEw 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 występują problemy 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 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ć 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 w każdej sesji, zmodyfikuj klucz rejestru przechowując wartości PSModulePath. Wartości PSModulePath są przechowywane w rejestrze jako nierozciągniętych ciągów. Aby uniknąć trwałego zapisywania wartości
Poniższy przykład dodaje ścieżkę C:\Program Files\Fabrikam\Modules do wartości zmiennej środowiskowej PSModulePath bez rozwijania nierozwiniętych ciągów.
$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)