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 $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 lokalizacjaDocumentsfolderu 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ęDocumentsfolderu. Aby sprawdzić lokalizacjęDocumentsfolderu, 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\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
PSModulePathnie istnieje, połącz ścieżki CurrentUser, AllUsers i$PSHOMEmodułów - Jeśli
PSModulePathistnieje:- Jeśli
PSModulePathzawiera$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
PSModulePathjako 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 Pathmaszyny .
- Pobieranie zakresu użytkownika
PSModulePath - Porównanie z dziedziczonej
PSModulePathzmiennej środowiskowej procesu- Jeśli to samo:
- Dołącz wartość AllUsers
PSModulePathna końcu po semantyce zmiennej środowiskowejPATH - Ścieżka systemu Windows
System32pochodzi ze zdefiniowanejPSModulePathmaszyny, 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.jsonzawiera użytkownika oPSModulePathokreślonym zakresie , użyj tego zamiast wartości domyślnej dla użytkownika - Jeśli
powershell.config.jsonzawiera system oPSModulePathzakresie , 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
$PSHOMEPS7
Ś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.
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 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-ModuleFullyQualifiedName . 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)