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 lokalizacjaDocuments
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
.
- W systemie Windows te moduły są przechowywane w programie
- 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
.
- W systemie Windows te moduły są przechowywane w programie
- 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\Modules
programie , 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
- Ścieżka modułów AllUsers jest wstawiana przed
- inaczej:
- Po prostu użyj
PSModulePath
jako zdefiniowanego, 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 $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 Path
maszyny .
- 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 środowiskowejPath
- Ścieżka systemu Windows
System32
pochodzi ze zdefiniowanejPSModulePath
maszyny, więc nie trzeba ich jawnie dodawać
- Dołącz wartość AllUsers
- Jeśli jest inaczej, traktuj je tak, jakby użytkownik jawnie go zmodyfikował i nie dołączaj użytkowników AllUsers
PSModulePath
- Jeśli to samo:
- Prefiks z ps7 użytkownika, systemu i
$PSHOME
ścieżek w tej kolejności- Jeśli
powershell.config.json
zawiera użytkownika oPSModulePath
określonym zakresie , użyj tego zamiast wartości domyślnej dla użytkownika - Jeśli
powershell.config.json
zawiera system oPSModulePath
zakresie , należy użyć tego zamiast domyślnego dla systemu
- Jeśli
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)