Udostępnij za pośrednictwem


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.

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
    • inaczej:
      • Po prostu użyj PSModulePath zgodnie z definicją, ponieważ użytkownik celowo usunął lokalizację $PSHOME

Ś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 Patho zakresie maszyny.

  • Pobieranie PSModulePath o zakresie użytkownika
  • Porównanie z dziedziczonej PSModulePath zmiennej środowiskowej procesu
    • Jeśli to samo:
      • Dołącz AllUsersPSModulePath na końcu po semantyce zmiennej środowiskowej Path
      • Ścieżka System32 systemu Windows pochodzi ze zdefiniowanej PSModulePath maszyny, dlatego nie trzeba ich jawnie dodawać
    • Jeśli jest inaczej, traktuj go tak, jakby użytkownik jawnie go zmodyfikował i nie dołączaj AllUsersPSModulePath
  • Prefiks z ścieżkami użytkownika, systemu i $PSHOME PS7 w tej kolejności
    • Jeśli powershell.config.json zawiera PSModulePatho zakresie użytkownika, użyj tego zamiast wartości domyślnej dla użytkownika
    • Jeśli powershell.config.json zawiera PSModulePatho zakresie systemu, należy użyć tej wartości zamiast domyślnej dla systemu

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 ( lub ). 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 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ż