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.
Ta modyfikacja dotyczy tylko Windows procesów programu PowerShell uruchamianych bezpośrednio przez program PowerShell 7. Po uruchomieniu Windows programu PowerShell przez proces pośredni, taki jak cmd.exe proces lub Python uruchomiony przez program PowerShell 7, proces pośredni dziedziczy niezmodyfikowany $Env:PSModulePath program PowerShell 7 i przekazuje go do własnych procesów podrzędnych. Windows program PowerShell został uruchomiony w ten sposób, utrzymuje dziedziczone ścieżki modułów programu PowerShell 7. Ponieważ te ścieżki poprzedzają ścieżkę modułu systemu Windows PowerShell, Windows program PowerShell może rozpoznawać nazwy modułów udostępnionych, takie jak Microsoft.PowerShell.Utility, do wersji modułu programu PowerShell 7, których nie można załadować. Spowoduje to uszkodzenie automatycznego ładowania modułu, a polecenia cmdlet z tych modułów kończą się niepowodzeniem z powodu błędu CommandNotFoundException .
Aby rozpocząć Windows programu PowerShell z pośredniego procesu z odpowiednimi ścieżkami modułu, usuń je PSModulePath ze środowiska procesu podrzędnego. Windows program PowerShell tworzy wartość domyślną podczas uruchamiania. Na przykład:
W programie PowerShell w wersji 7.4 lub nowszej użyj parametru Environment polecenia
Start-Process, aby usunąć zmienną ze środowiska procesu pośredniego:Start-Process python harness.py -Environment @{ PSModulePath = $null }W
cmd.exepliku wyczyść zmienną przed rozpoczęciem Windows programu PowerShell:cmd /c "set PSModulePath=&& powershell.exe -File script.ps1"W Python usuń zmienną ze środowiska przekazywanego do procesu podrzędnego:
import os import subprocess env = {k: v for k, v in os.environ.items() if k.upper() != "PSMODULEPATH"} subprocess.run(["powershell.exe", "-File", "script.ps1"], env=env)
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)